滑动窗口法
-
自己的直接法
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int res = 0, sum = 0; /*寻找长度为res的字串 * 从第i个位置开始 * 一直加到第i+res-1的位置 * 即构成了第i个位置处长度为res的子串 */ for(res = 1; res <= nums.size(); res++) { //寻找长度为res的子串 for(int i = 0; i <= nums.size() - res; i++) { sum = 0; for(int j = i; j < i + res; j++ ) { //if(j >= nums.size()) break; sum = sum + nums[j]; } if(sum >= target) return res; } } return 0; } };
虽然也可以做出来,但算法时间复杂度在甚至O(n_3)
-
另一种直接法,寻找所有以第i个元素开始的子串
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int res = nums.size() + 1, sum = 0; /* 从第i个位置开始 * 寻找所有的子串 * 即构成了第i个位置处长度为res的子串 */ for(int i = 0; i < nums.size(); i++) { sum = 0; int j = i; for(j = i; j < nums.size() ; j++) { sum = sum + nums[j]; if(sum >= target) break; } if(res > j + 1 - i && j < nums.size()) res = j + 1 - i; } if (res < nums.size() + 1) return res; else return 0; } };
-
滑动窗口法:通过窗口右侧的扩大增大敞口来寻找满足条件的值,在通过右侧的扩大来减小窗口大小来寻找最小的窗口
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int res = nums.size() + 1; int j = 0, sum = 0; for(int i = 0; i < nums.size(); i++) { sum = sum + nums[i]; while(sum >= target) { if(res < i + 1 - j) res = i + 1 - j; sum = sum - nums[j]; j++; } } if(res < nums.size() + 1) return res; else return 0; } };