/*class Solution {
public:
//双指针
//时间O(n), 空间O(1)
int minSubArrayLen(int s, vector<int>& nums) {
if(s <= 0 || nums.size() == 0) return 0;
int ans = INT_MAX;
int start = 0, end = 0;
int sum = 0;
while(end < nums.size()) {
sum += nums[end];
while(sum >= s) {
ans = min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX ? 0 : ans;
}
};*/
class Solution {
public:
//前缀和+二分查找
//时间O(nlogn), 空间O(n)
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int ans = INT_MAX;
vector<int> sums(n + 1, 0);
// 为了方便计算,令 size = n + 1
// sums[0] = 0 意味着前 0 个元素的前缀和为 0
// sums[1] = A[0] 前 1 个元素的前缀和为 A[0]
// 以此类推
for (int i = 1; i <= n; i++) {
sums[i] = sums[i - 1] + nums[i - 1];
}
for (int i = 1; i <= n; i++) {
int target = s + sums[i - 1];
auto bound = lower_bound(sums.begin(), sums.end(), target);
if (bound != sums.end()) {
ans = min(ans, static_cast<int>((bound - sums.begin()) - (i - 1)));
}
}
return ans == INT_MAX ? 0 : ans;
}
};
LeetCode209. 长度最小的子数组
最新推荐文章于 2024-01-17 14:30:38 发布