classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int flag = 0; int ans = nums.size(); //遍历滑动窗口的大小 for (int len = 1; len <= nums.size(); ++len) { for (int i = 0, j = i + len; j <= nums.size(); ++i, ++j) { int sum = 0; for (int k = i; k < j; ++k) sum += nums[k]; if (sum >= target && len <= ans) { ans = len; flag = 1; } } } if (!flag) return0; return ans; } };
classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int flag = 0; int ans = nums.size(); //遍历滑动窗口的大小 for (int len = 1; len <= nums.size(); ++len) { int sum = 0; for (int i = 0; i < len; ++i) sum += nums[i]; if (sum >= target && len <= ans) { ans = len; flag = 1;} for (int i = 0, j = i + len; j < nums.size(); ++i, ++j) { sum -= nums[i]; sum += nums[j]; if (sum >= target && len <= ans) { ans = len; flag = 1; } } } if (!flag) return0; return ans; } };
3.动态滑动窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//写法1 classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int ans = INT32_MAX; int sum = 0; for (int i = 0, j = 0; j < nums.size(); ++j) { sum += nums[j]; while (sum >= target) { ans = min((j - i + 1), ans); sum -= nums[i]; i++; } } return ans == INT32_MAX ? 0 : ans; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
//写法2 将ans的更新操作写在while循环中可降低程序执行时间! classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int sum = 0; int ans = INT32_MAX; for (int i = 0, j = 0; j < nums.size(); ++j) { int flag = 0; sum += nums[j]; while (sum >= target) { flag = 1; sum -= nums[i]; i++; } if (flag) ans = min((j - i + 2), ans); } return ans == INT32_MAX ? 0 : ans; } };