今天刷的LeetCode编程题目是209.长度最小的子数组,以下是学习笔记:
用滑动窗口来解,滑动窗口是一个解题模板,LeetCode许多题都可以用此模板来解。
滑动窗口:
定义两个指针 start 和end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量sum 存储子数组中的元素和(即从 nums[start] 到nums[end] 的元素和)。
初始状态下,start 和 end 都指向下标 0,sum 的值为 0。
每一轮迭代,将 nums[end] 加到 sum,如果sum≥s,则更新子数组的最小长度(此时子数组的长度是 end−start+1),然后将nums[start] 从sum 中减去并将 start 右移,直到 sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将end 右移。
算例:
初始时定义最小子数组的长度为ans=INT_MAX,当找到一组解的时候,会更新“ans = min(ans, end - start + 1);”,最后只需要“return ans == INT_MAX ? 0 : ans; ”来检查ans是否是原来的值,如果是,说明无解,返回0。
查看了网友的讨论,ans也可以设置为nums.size()+1,改过代码后发现仍可以通过所有测试用例。但是在寻找最小值的时候习惯上设置一个比较大的值INT_MAX,该值为+2147483647,找到一组解后立刻更新此值。
该题的C++题解代码为:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int ans = INT_MAX;
//int ans=nums.size()+1;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += nums[end];
while (sum>=s) {
ans = min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX ? 0 : ans;
//return ans == nums.size()+1 ? 0 : ans;
}
};
参考文章:
https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
https://blog.csdn.net/weixin_40539125/article/details/86032914?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-3.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-3.pc_relevant_default&utm_relevant_index=6