剑指 Offer II 008. 和大于等于 target 的最短子数组

117 阅读1分钟

剑指 Offer II 008. 和大于等于 target 的最短子数组

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

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

代码实现

思路:先让前面k个元素相加,直到满足他们的和 大于等于 target,记录下元素个数,并且尝试一下从前面开始删除一个元素,剩下的元素的和是否 大于等于 target,如果是的,则覆盖一下元素的个数,直到不满足 sum >= target,把剩下的元素,再新增一个元素进来,再重复一下上面的操作

var minSubArrayLen = function (target, nums) {
  var len = nums.length + 1;
  var i = 0;
  var sum = 0;
  for (var j = 0; j < nums.length; j++) {
    sum += nums[j];
    while (sum >= target) {
      if (j - i + 1 < len) {
        len = j - i + 1;
      }
      sum -= nums[i++];
    }
  }
  return len > nums.length ? 0 : len;
};
console.log(minSubArrayLen(7,[2, 3, 1, 2, 4, 3]));

流程分析

image.png