滑动窗口入门题 前缀和入门题
LeetCode链接:209. 长度最小的子数组
1.题目描述
给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其总和大于等于 target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
1 2 3
| 输入:target = 7, nums = 输出:2 解释:子数组 是该条件下的长度最小的子数组。
|
示例 2:
1 2
| 输入:target = 4, nums = [1,4,4] 输出:1
|
示例 3:
1 2
| 输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
|
提示:
- $1 <= target <= 10^9$
- $1 <= nums.length <= 10^5$
- $1 <= nums[i] <= 10^5$
进阶:
- 如果你已经实现
O(n)
时间复杂度的解法, 请尝试设计一个 O(n log(n))
时间复杂度的解法。
2.题解
- 方法2的时间复杂度$O(n)$
- 方法3的时间复杂度$O(nlog(n))$
2.1 暴力解法-超出时间限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public int minSubArrayLen(int s, int[] nums) { int ans = Integer.MAX_VALUE; for (int i = 0; i < nums.length; i++) { int sum = 0; for (int j = i; j < nums.length; j++) { sum += nums[j]; if (sum >= s) { ans = Math.min(ans, j - i + 1); break; } } } return ans == Integer.MAX_VALUE ? 0 : ans; } }
|
2.2 双指针+滑动窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public int minSubArrayLen(int target, int[] nums) { int sum = 0; int left = 0, right; int minLen = nums.length + 1;
for (right = 0; right < nums.length; right++) { sum += nums[right];
while (sum >= target) { minLen = Math.min(minLen, right - left + 1); sum -= nums[left++]; } }
return minLen == nums.length + 1 ? 0 : minLen; } }
|
2.3 前缀和+二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public int minSubArrayLen(int target, int[] nums) { int minLen = Integer.MAX_VALUE;
int[] sums = new int[nums.length + 1]; for (int i = 1; i <= nums.length; i++) { sums[i] = sums[i - 1] + nums[i - 1]; }
for (int i = 1; i <= nums.length; i++) { int newTarget = target + sums[i - 1]; int left = i, right = sums.length; while (left < right) { int mid = (left + right) / 2; if (sums[mid] < newTarget) { left = mid + 1; } else { right = mid; } }
if (left < sums.length) { minLen = Math.min(minLen, left - i + 1); } }
return minLen == Integer.MAX_VALUE ? 0 : minLen; } }
|