主页 > 软件开发  > 

特辣的海藻!7

特辣的海藻!7
特邀嘉宾:滑动窗口~ 题 209. 长度最小的子数组 - 力扣(LeetCode)

 做过的题,再一次做,还是有问题。。。。我把它给解决掉!

超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时

import java.lang.Math; class Solution { public int minSubArrayLen(int target, int[] nums) { int n = nums.length, minLen = n+1, sum = 0; int[] cnt = new int[n]; for(int i = 0; i < n; i++) { int len = 1; sum = nums[i]; for(int j = i + 1; j < n; j++) { if(sum >= target){ break; } else{ sum += nums[j]; len++; } } if(sum >= target) minLen = Math.min(len, minLen); } minLen = minLen == n+1 ? 0 : minLen; return minLen; } }

没错但也不推荐 没错但也不推荐 没错但也不推荐 没错但也不推荐 没错但也不推荐 

class Solution { public int minSubArrayLen(int target, int[] nums) { int len = 0, sum = 0, j = 0, minLen = nums.length+1; for (int i = 0; i < nums.length; i++) { sum += nums[i]; len++; while (sum >= target) { minLen = Math.min(len, minLen); sum -= nums[j]; j++; len--; } } minLen = minLen == nums.length+1 ? 0 : minLen; return minLen; } }

来! 看这个!! 来! 看这个!! 来! 看这个!! 来! 看这个!!  来! 看这个!!  

class Solution { public int minSubArrayLen(int target, int[] nums) { int sum = 0, j = 0, minLen = nums.length+1; for (int i = 0; i < nums.length; i++) { sum += nums[i];; while (sum >= target) { minLen = Math.min(i-j+1, minLen); sum -= nums[j]; j++; } } minLen = minLen == nums.length+1 ? 0 : minLen; return minLen; } }

 这道题用暴力for循环超时,用滑动窗口的思路就是:当满足条件sum大于等于目标值就缩小窗口,寻找下一个可能的答案。

我觉得我当时是没有弄懂滑动窗口的核心要点:

● 在外循环中扩展右边界,内循环中移动左边界

● 逐个扩展右边界,及时收缩左边界(才能覆盖所有子数组)

● 实时记录滑动窗口的长度,用窗口的端点 [j, i],即 j-i+1,而不是用一个变量

● 先记录长度,再移动指针更改左边界

我就是没有理解领会到到底应该怎样移动这个窗口,是要一个一个移动窗口,逐个元素的扩展有边界,而不是不满足状态时才移动,这样跳跃式移动会错过可能的答案。(比如数组中单个元素就是target值)。还有是用的变量记录数组长度,然后自以为的更新长度时没问题,先缩小窗口,再记录长度就出错。应该要先记录此时窗口的长度,再缩小窗口。

 1701. 平均等待时间 - 力扣(LeetCode)

 

 

标签:

特辣的海藻!7由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“特辣的海藻!7