LeetCode算法学习之- 滑动窗口-[209] 长度最小的子数组

272 阅读1分钟

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

分析

1.连续子数组 =》 滑动窗口

2.子数组的和=》 前缀和

可以采用滑动窗口的方式

解法:滑动窗口


思想
1. 利用前缀和来判断哪些情况是大于target的
2. 利用滑动窗口来向左缩进来求长度的最小值
*/
/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (target, nums) {
  const sumArr = [0];
//   求前缀和
  for (let i = 0; i < nums.length; i++) {
    sumArr[i + 1] = nums[i] + sumArr[i];
  }

//   利用滑动窗口来求满足条件的 窗口,最终选出长度最短的值
  let min = Infinity;
  for (let j = 0; j < sumArr.length; j++) {
    if (sumArr[j] >= target) {
      for (let i = 0; i < j; i++) {
        if (sumArr[j] - sumArr[i] >= target) {
          min = Math.min(j - i,min);
        }
      }
    }
  }

//   如果min没有被改变 则说明没有找到合适的窗口 所以返回0
  return min === Infinity ? 0 : min;
};

//时间复杂度:O(n^2)
//空间复杂度:O(n)


总结

今天这道题是主要是练习如何使用不固定尺寸的滑动窗口 来求最小的连续子数组长度

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\