您的位置:首页 > 财经 > 产业 > 中国疫情最新消息数据图_动漫制作技术就业前景_青岛网站推广系统_网络营销广告策划

中国疫情最新消息数据图_动漫制作技术就业前景_青岛网站推广系统_网络营销广告策划

2025/1/13 13:34:26 来源:https://blog.csdn.net/qq_14815605/article/details/144351965  浏览:    关键词:中国疫情最新消息数据图_动漫制作技术就业前景_青岛网站推广系统_网络营销广告策划
中国疫情最新消息数据图_动漫制作技术就业前景_青岛网站推广系统_网络营销广告策划

LeetCode 209.长度最小的子数组

题目描述

给定一个正整数数组 nums 和一个正整数 target,找出连续子数组的最小长度,使得子数组的和大于或等于 target。如果不存在符合条件的子数组,返回 0。

Java 实现代码

public class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int left = 0, sum = 0, minLength = Integer.MAX_VALUE;for (int right = 0; right < n; right++) {sum += nums[right]; // 扩展窗口,加入当前元素// 窗口内的和大于等于 target 时,尝试缩小窗口while (sum >= target) {minLength = Math.min(minLength, right - left + 1);sum -= nums[left]; // 移动左指针,缩小窗口left++;}}return minLength == Integer.MAX_VALUE ? 0 : minLength;}
}

解题思路

  1. 滑动窗口:使用两个指针 leftright 来表示当前窗口的边界,窗口的右边界逐步扩展,直到窗口内的和大于等于 target

  2. 窗口收缩:每当当前窗口的和大于等于 target 时,尝试通过移动左指针(即收缩窗口)来找到最小的符合条件的子数组。每次更新最小长度。

  3. 返回结果:在遍历完数组后,若未找到符合条件的子数组,则返回 0;否则返回最小长度。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。由于每个元素最多被访问两次(一次是右指针扩展,另一次是左指针收缩),因此时间复杂度是 O(n)。
  • 空间复杂度:O(1),只用了常数级别的额外空间。

举例说明执行过程

假设输入数组 nums = [2, 3, 1, 2, 4, 3]target = 7

  1. 初始化

    • left = 0, sum = 0, minLength = Integer.MAX_VALUE
  2. 遍历右指针

    • right = 0sum = 0 + nums[0] = 2sum = 2,不满足条件 sum >= 7,继续扩展。
    • right = 1sum = 2 + nums[1] = 5sum = 5,不满足条件 sum >= 7,继续扩展。
    • right = 2sum = 5 + nums[2] = 6sum = 6,不满足条件 sum >= 7,继续扩展。
    • right = 3sum = 6 + nums[3] = 8sum = 8,满足条件 sum >= 7,此时子数组为 [2, 3, 1, 2],长度为 4,更新 minLength = 4
  3. 收缩窗口

    • 由于满足 sum >= target,我们尝试通过移动 left 来缩小窗口:
    • left = 0sum = 8,缩小窗口,sum -= nums[0] = 8 - 2 = 6left = 1sum = 6,不满足 sum >= 7,继续扩展右指针。
  4. 继续遍历

    • right = 4sum = 6 + nums[4] = 10,满足 sum >= 7,此时子数组为 [3, 1, 2, 4],长度为 4,但 minLength 仍然保持 4。
  5. 收缩窗口

    • left = 1sum = 10,继续缩小窗口,sum -= nums[1] = 10 - 3 = 7,此时 sum >= target,子数组为 [1, 2, 4],长度为 3,更新 minLength = 3
  6. 继续遍历

    • right = 5sum = 7 + nums[5] = 10,满足 sum >= 7,此时子数组为 [1, 2, 4, 3],长度为 4,但 minLength 保持为 3。
  7. 收缩窗口

    • left = 2sum = 10,继续缩小窗口,sum -= nums[2] = 10 - 1 = 9,仍然满足 sum >= 7,子数组为 [2, 4, 3],长度为 3,minLength 保持为 3。
    • left = 3sum = 9,继续缩小窗口,sum -= nums[3] = 9 - 2 = 7,满足 sum >= 7,子数组为 [4, 3],长度为 2,更新 minLength = 2
  8. 结束遍历

    • 右指针已经遍历完整个数组,最终得到 minLength = 2

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com