已解决
LeetCode 之 长度最小的子数组
来自网友在路上 170870提问 提问时间:2023-09-19 08:58:31阅读次数: 70
最佳答案 问答题库708位专家为你答疑解惑
算法模拟: Algorithm Visualizer
在线工具: C++ 在线工具
如果习惯性使用Visual Studio Code进行编译运行,需要C++11特性的支持,可参考博客:
VisualStudio Code 支持C++11插件配置
长度最小的子数组
LeetCode 长度最小的子数组
问题:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:
输入:target = 4, nums = [1,4,4]
输出:1示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
思路:
可以使用滑动窗口的方法, 其实也是双指针的思想
定义两个指针 left
和 right
,分别表示子数组的左边界和右边界。
初始时,将 left
和 right
都指向数组的第一个元素。
然后,我们不断增加 right
指针的位置,同时计算子数组的总和。
如果总和大于等于 target
,则更新最小长度,并将 left
指针向右移动,缩小子数组的范围。
重复这个过程,直到 right
指针到达数组的末尾。
最后,返回最小长度即可。
C++示例
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {// 左边界指针int left = 0;// 初始化满足条件的最小长度int minLen = INT_MAX;// 子数组总和int curValue = 0;for (int right = 0; right < nums.size(); ++right) {curValue += nums[right];while(curValue >= target) {minLen = std::min(minLen, right - left + 1);curValue -= nums[left];left++;}}return (minLen != INT_MAX) ? minLen : 0;}
};
TypeScript示例
function minSubArrayLen(target: number, nums: number[]): number {let left:number = 0;let minLen: number = Infinity;let curValue: number = 0;for (let right = 0; right < nums.length; right++) {curValue += nums[right];while (curValue >= target) {minLen = Math.min(minLen, right - left + 1);curValue -= nums[left];left++;}}return (minLen !== Infinity) ? minLen : 0;
};
待定…
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"LeetCode 之 长度最小的子数组":http://eshow365.cn/6-9223-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!