题目
给定一个含有 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
\