https://leetcode-cn.com/problems/minimum-size-subarray-sum
初步想法,前缀和 + 双指针。没想到真的过了,虽然是个水题哈哈哈
然而后来发现根本不用弄个什么鬼前缀和来浪费空间,自作聪明,导致我的内存就消耗这么大了:(
后面贴有别人的范例代码
对于大循环执行的条件
由于我这里前缀和数组头部加了个0,所以r可以等于size
while (l <= r && r <= nums.size())
循环内部的判断就很简单了
不够大就一直加,如果够大了就比较大小,最后l右移
while (l <= r && r <= nums.size() && qz[r] - qz[l-1] < s)
r++;
if (l <= r && r <= nums.size() && qz[r] - qz[l-1] >= s)
ans = min(ans, r - l + 1);
l++;
完整代码
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if (!nums.size()) return 0;
if (nums.size() < 2) return nums[0] >= s;
vector <int> qz;
qz.push_back(0);
for (int i = 0; i < nums.size(); i++)
qz.push_back(nums[i] + qz[i]);
int l = 1, r = 1;
int ans = 0x3f3f3f3f;
while (l <= r && r <= nums.size()) {
while (l <= r && r <= nums.size() && qz[r] - qz[l-1] < s)
r++;
if (l <= r && r <= nums.size() && qz[r] - qz[l-1] >= s)
ans = min(ans, r - l + 1);
l++;
}
return ans == 0x3f3f3f3f ? 0 : ans;
}
};
看了看别人的代码,哇真的赏心悦目好吗,我的代码简直就是一坨shit
这里贴个内存最小的范例,简洁明了思路清晰,我还搁那用前缀和,我晕
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums)
{
int n = nums.size();
int ans = INT_MAX;
int left = 0;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
while (sum >= s) {
ans = min(ans, i + 1 - left);
sum -= nums[left++];
}
}
return (ans != INT_MAX) ? ans : 0;
}
};