LeetCode LCR 008. 长度最小的子数组
题目描述
思路分析
解法一:滑动窗口(推荐)
核心思路:
- 用双指针维护窗口和当前和。
- 右指针扩展直到满足条件,再收缩左指针以缩短长度。
- 持续更新最短长度。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示数组长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int ans = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= target) {
ans = Math.min(ans, right - left + 1);
sum -= nums[left];
left++;
}
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
func minSubArrayLen(target int, nums []int) int {
left := 0
sum := 0
ans := 1<<31 - 1
for right := 0; right < len(nums); right++ {
sum += nums[right]
for sum >= target {
if right-left+1 < ans {
ans = right - left + 1
}
sum -= nums[left]
left++
}
}
if ans == 1<<31-1 {
return 0
}
return ans
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 713. 乘积小于 K 的子数组 | 中等 | 滑动窗口 |
| 3. 无重复字符的最长子串 | 中等 | 滑动窗口 |
| 76. 最小覆盖子串 | 困难 | 滑动窗口 |
| 209. 长度最小的子数组 | 中等 | 滑动窗口 |
| 1004. 最大连续1的个数 III | 中等 | 滑动窗口 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!