力扣-长度最小的子数组
1.题目描述
2.题目链接
LCR 008. 长度最小的子数组 - 力扣(LeetCode)
3.题目分析
这道题目我们使用的也是双指针。我们可以定义两个指针都指向数组第一个元素,然后使用right指针遍历原数组,计算left指针到right指针之间的所有元素的和是否大于等于target。
如果大于,就停止right的遍历,存储此时的最小数组长度length,再移动left指针,直到left指针到right指针之间的所有元素的和小于target时,停止left的移动,继续right指针的移动。
重复此过程,直到right指针遍历完数组,在此期间,不断地取存储的length和新的right-left+1的最小值,最后得到的就是长度最小的子数组了。
我们可以发现,这道题和我们前面做过的双指针题目并不是很相似,因为left和right指针同向移动并且不会回退,也就是说两个指针一直在向同一个方向移动。这种移动就像是一个窗口在数组中滑动,所以我们称呼这种算法为滑动窗口。 ;
滑动窗口的步骤主要分为:
其中进窗口就是right遍历数组;判断就是left和right之间的元素之和是否大于target;出窗口就是left移动。
4.代码细节
1)我们可以定义length的初始值为Integer.MAX_VALUE:
int left=0,right=0,sum=0,length=Integer.MAX_VALUE;
这样,无论我们求得的length是多少,我们通过取最小值的方式都可以更新到length,如果我们设置length的初始值为0的话,无论我们求得的length是多少,最后取最小值得到的length都是0。
length=Math.min(length,right-left+1);
2) return length!=Integer.MAX_VALUE?length:0;
题目要求我们在没有找到符合条件的子数组的时候返回0,所以我们可以通过三位运算符的return来进行返回。
return length!=Integer.MAX_VALUE?length:0;