Leetcode:209.长度最小的子数组
编辑
22
2024-05-15
Leetcode题目链接:209. 长度最小的子数组
题目描述:
给定一个含有 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
解题思路:
双指针(滑动窗口)
定义start作为区间起始位置,end作为区间终点位置,result为最终区间长度,初始化为INT_MAX
循环累加数组元素,找到满足累加器sum >= target的情况,此时start记录区间起始位置,end记录区间结束位置
为了找到长度最小的连续子数组,需要对当前找到的这个满足条件的区间进行进一步的缩小(但是还是要满足缩小后的区间大小大于等于target值)
采用将区间开始位置start向后移动的方法进行区间缩减,直至找到满足条件的最小区间,记录其长度为result
继续执行for循环,执行所有可能情况以确定最终的result值
最后需要进行特殊判断,若result的初始值(即INT的最大值)未被修改,意味着不存在符合条件的子数组,需要返回0(这里使用三元运算符进行判断)
我的答案:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int start = 0,sum = 0,len = 0;
int result = std::numeric_limits<int>::max();
for(int end = 0; end < nums.size(); end++ ){
sum += nums[end];
while(sum >= target){
len = end - start + 1;
result = min(result, len);
sum -= nums[start];
start++;
}
}
return result == std::numeric_limits<int>::max() ? 0 : result;
}
};
提交结果:
官方答案:
//暴力法:通过两层for循环找出所有可能的区间结果,并在此过程中确定最小的区间长度
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int ans = INT_MAX;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += nums[j];
if (sum >= s) {
ans = min(ans, j - i + 1);
break;
}
}
}
return ans == INT_MAX ? 0 : ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/305704/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 0
- 0
-
赞助
AliPayWeChat Pay -
分享