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.代碼解答
class Solution {public int minSubArrayLen(int target, int[] nums) {Set<Integer> set=new HashSet<>();int left=0,right=0,sum=0,length=Integer.MAX_VALUE;for(;right<nums.length;right++){sum+=nums[right];while(sum>=target){length=Math.min(length,right-left+1);sum-=nums[left];left++;}}return length!=Integer.MAX_VALUE?length:0;}
}
5.代碼細節
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;