题目表述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
来源:力扣(LeetCode)
链接:leetcode.cn/problems/mi…
难点分析和解法
暴力解法直观纯粹,两层循环,一层找起点,一层找终点。但时间复杂度太高。
本题难点在于利用双指针的滑动窗口原理降低复杂度。
利用accumulate()函数判断和与target比较,进行剪枝
if(accumulate(nums.begin(), nums.end(), 0) < target) return 0;
双指针法创造滑动窗口
首先,起始指针i和终止指针j同时指向起点第一个元素。然后,终止指针j循环遍历数组,直到找到第一个满足条件,和大于等于target的子数组。此时,循环遍历起始指针i,直到找到满足条件的最短子数组。
继续往复循环,滑动窗口一直在寻找满足条件的子数组,直到j循环结束,确定最终子数组。
我的BUG
- 代码思路不清晰:指针 i 进行窗口起始位置滑动时,代码冗余:用一个while循环就可解决。
sum -= nums[i]:由于先对 i 执行自减操作,这里实际上减去的是有效数据的下一个数据。