滑动窗口-长度最小的子数组

1|0长度最小的子数组

滑动窗口-长度最小的子数组

  1. 暴力法: 区间由left, 和right确定, 因此需要两层for循环遍历left和right, O(n^2)
  2. 滑动窗口法: 滑动窗口也是使用双指针确定窗口的left和right, left和right如何移动?, right要从0 到length - 1移动, 步长1, 也就是用for循环, left, 移动取决于sum >= target 使用while动态移动。

2|0题解

class Solution { public int minSubArrayLen(int target, int[] nums) { //滑动窗口法: 使用首尾指针控制滑动窗口的起点终点位置。-> 遍历一遍滑动窗口的末尾位置, 动态改变窗口起点 O(n) int left = 0; int sum = 0; int result = Integer.MAX_VALUE; for (int right = 0; right < nums.length; right++) { sum += nums[right]; //使用while使得left可以一直增加刚好sum>=target √ while (sum >= target) { result = Math.min(result, right - left + 1); //起点位置向前移动1,保留后面sum计算结果 sum -= nums[left++]; } } return result == Integer.MAX_VALUE ? 0 : result; } } class Solution2 { public int minSubArrayLen(int target, int[] nums) { // 暴力法: 一层循环遍历元素作为起点, 另一层循环从起点搜索找到合适终点 -> 有重复计算O(nlogn) int result = 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 >= target) { int subLength = j - i + 1; result = Math.min(subLength, result); break; } } } return result == Integer.MAX_VALUE ? 0 : result; } }

__EOF__

本文作者Rocky
本文链接https://www.cnblogs.com/nrocky/p/15889169.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -Rocky-  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示