所属专栏:【LeetCode题解(持续更新中)】
作 者:我是夜阑的狗
个人简介:一个正在努力学技术的码仔,专注基础和实战分享 ,欢迎咨询!
欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
大家好,又见面了,我是夜阑的狗,本文是专栏【LeetCode题解】专栏的第10篇文章,主要讲解是LeetCode209. 长度最小的子数组(双指针-滑动窗口))。
专栏地址:【LeetCode题解(持续更新中)】, 此专栏是我是夜阑的狗对LeetCode问题的讲解,希望能够加深自己的印象,以及帮助到其他的小伙伴。
如果文章有什么需要改进的地方还请大佬不吝赐教。
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 LeetCode题目链接。
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
输入:target = 4, nums = [1,4,4]
输出:1
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
- 1 <= target <= 109
- 1 <= nums.length <= 105
- 1 <= nums[i] <= 105
- 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。
这次还是老规矩练习一下双指针的思想,不枉练习这么多次双指针的题,现在双指针思路算是有一点长进了。其关键点还是该怎么去移动这两个指针?这一点要理清楚。;
解决方法1(个人想法):
一开始就是用滑动窗口进行移动寻找子数组,但对循环的结束判定却把握不准,导致程序运行超时。
时间复杂度 O(N): 其中N是数组的长度。指针left和right最多各移动N次。
空间复杂度 O(1): 使用常数额外空间。
红色部分代表滑动窗口的大小。(注:本人不会做成流程动画,希望会的朋友可以私信我指点一二,说个软件名字也可以,谢谢)
。每个代码块都写了注释,方便理解,代码还可以改进;
代码如下(示例):
解法一:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//方法一
//初始状态下,left和right都指向下标0,sum的值为0。
int left = 0, right = 0, length = nums.length-1, min = length+2, sum = 0;
while(right <= length){
sum += nums[right];
//当滑动窗口内总数之和大于或等于目标值时,则left试着向右边移动,寻找最小长度
while(sum >= target){
min = Math.min(min, right-left+1);
sum -= nums[left++];
}
right++;
}
return min == length+2 ? 0 : min;
//错误思路
<!-- if(sum < target){
right++;
if(right > length && min == length + 2) return 0;
}
else{
while(sum >= target){
sum -= nums[left++];
}
min = Math.min(min, right-left+2);
sum = 0;
left++;
right = left;
}
return min == length+2 ? 0 : min; -->
}
}
以上就是今天要讲的内容,做题的时候,就是奔着双指针的思路进行解决的,练习这么多次现在逐渐找到了点感觉。我感觉就是双指针的关键点就是在于该怎么去移动两个指针,理清这一点之后离结果也就不远了,这次双指针都是指向滑动窗口来进行移动才能减少运行时间,但想好了怎么移动这两个指针,却卡着不知道该怎么结束循环,这块没想好导致程序运行最后一个例子时报运行超时。所以就赶紧记录一下这时刻。
感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。
也欢迎你,关注我。
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!! 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!
更多专栏订阅:
- 【LeetCode题解(持续更新中)】
- 【Java Web项目构建过程】
- 【数字图像处理】
- ⚽ 【JavaScript随手笔记】
- 【大数据学习笔记(华为云)】
- 【程序错误解决方法(建议收藏)】
- 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!