题目
LeetCode - 209. Minimum Size Subarray Sum
题目链接
https://leetcode.com/problems/minimum-size-subarray-sum/
参考博客
https://www.cnblogs.com/zjutlitao/p/3485545.html
解题思路
- 采用暴力解决,时间复杂度是 O ( n 3 ) O(n^3) O(n3),这个基本上是不可接受的,最后也报了时间超限;
- 对方法1进行改进,得到代码1,不单独求和,时间复杂度为 O ( n 2 ) O(n^2) O(n2),最后用此解法AC~.
- 进一步优化,设置两个指针,当
sum>=s
时,更新minlen
并将sum减少1个值,v指针再移动一格,当sum<s
时,将sum增大一个值,将u指针移动一格。最后听同学说这个是尺缩法的思想,搜索博客发现,原来这类方法叫尺缩法.
注:在陈越老师的《数据结构与算法》的MOOC视频上有1-3的优化过程,非常精彩。
解题源码
方法2:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len = nums.size();
if (!len) return 0;
int minlen = INT_MAX;
for (int i = 0; i < len; i++){
int sum = 0;
for (int j = i; j < len; j++){
sum += nums[j];
if(sum >= s){
minlen = min(minlen, j-i+1);
break;
}
}
}
if (minlen == INT_MAX) return 0;
return minlen;
}
};
方法3:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len = nums.size();
if (!len) return 0;
int minlen = INT_MAX;
int sum = 0;
int u = 0, v =0;
while(u <= len){
if (sum >= s) {
minlen = min(minlen, u - v);
sum -= nums[v];
v++;
} else {
if (u == len) break;
sum += nums[u];
u++;
}
}
if (minlen == INT_MAX) return 0;
return minlen;
}
};