LeetCode刷題系列 -- 209. 長度最小的子數組

題目

     給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組,並返回其長度。如果不存在符合條件的連續子數組,返回 0。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
 

思路

  定義兩個下標 i 與 j ,分別代表子數組的首尾。則 子數組的長度爲  j - i +1 ,定義 sum 爲子數組的和 ,minLen 爲數組的長度 ,目標和爲 target

則從 i = 0 與 j = 0 開始 ,

1)不斷將 j ++ ,並更新sum 的和,直到sum >= target ,此時記錄當前的數組長度

2)將i++ ,重複1)的操作

 

Java代碼如下:

    public int minSubArrayLen(int s, int[] nums) {

            int i=0,j=-1;

            int minLen = Integer.MAX_VALUE;
            int sum = 0;

            for(int a:nums){
                sum+=a;
            }
            if(sum<s){    //當數組中所有元素和都小於 target 時,則返回 0 
                return 0;
            }
            sum = 0;

            while (j<nums.length || sum>s){  //當sum大於0的時候,可以繼續將 i++ ,

                if(sum>=s){
                    if(minLen>(j-i+1)) {  //當新的滿足和要求的子數組長度更小時,則更新最小長度值
                        minLen = j - i + 1;
                    }
                    sum-=nums[i];  // i 向右移動一位,並更新子數組的值
                    i++;
                }else {
                    j++;
                    if(j<nums.length)
                      sum+=nums[j]; // j 向右移動一位,並更新子數組的值
                }
            }

            return minLen;
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章