209. 长度最小的子数组
暴力o(n^2)超时呵呵呵,不是能做出来就好了吗啊吧啊吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int sum; int min=100000; int count; for(int i=0;i<nums.size();i++){ sum=0; for(int j = i;j<nums.size();j++){ sum+=nums[j]; if(sum>=target){ count=j-i+1; min=min<count?min:count; break; } } if(min>nums.size()) min=0; } return min; } };
|
滑动窗口
思路是先让
sum+nums[j]
当sum>=target
的时候
算出子数组长度subL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| ```while```循环```nums[i++]```一直减到它```<target```退出```while```
用result记录min的subL
然后再次大循环从nums[j+1]
```c class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int i=0; int subL=0; int sum=0; int result=INT_MAX; for(int j =0;j<nums.size();j++){ sum+=nums[j]; while(sum>=target){ subL=j-i+1; sum-=nums[i]; result=min(result,subL); i++; } } return result==INT_MAX ? 0 : result; } };
|
如何理解
1
| return result==INT_MAX ? 0 : result;
|
当result==INT_MAX时候
是 返回0
否 返回result
如何理解
1
| result = result < subLength ? result : subLength;
|
当result<subL的时候
是 返回result
否 返回subL