天天看點

LeetCode 209. 長度最小的子數組(JAVA)

題目

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

示例: 

輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組。           

進階:

如果你已經完成了O(n) 時間複雜度的解法, 請嘗試 O(n log n) 時間複雜度的解法。

解題思路

public int minSubArrayLen(int s, int[] nums) {
        //雙浮動指針
        int minRet = Integer.MAX_VALUE;
        if (minRet <= 0){
            return 0;
        }
        int left = 0;
        int right = left;
        int subSumRet = nums[left];
        while (right <= nums.length-1){
//            System.out.println(left + " " + right + " subSum:" + subSumRet);
            //子數組少于目标數
            if (subSumRet<s){
                right++;
                //防止數組越界
                if (right >=nums.length){
                    return 0;
                }
                subSumRet += nums[right];
            }else
            {
                int[] subArr = Arrays.copyOfRange(nums, left, right+1);
                minRet = Math.min(minRet, subArr.length);
//                System.out.println(Arrays.toString(subArr) + " " + minRet);

                int tempSumRet = subSumRet - nums[left];
//                System.out.println("tempSubRet:"+tempSumRet);
                //如果減左沒法維持目标數就右增,否則就左減
                if (tempSumRet >=s && subArr.length>1)
                {
                    left++;
                    subSumRet = tempSumRet;
                }
                else
                {
                    right++;
                    //防止數組越界
                    if (right >=nums.length){
                        continue;
                    }
                    subSumRet += nums[right];
                }

            }
        }
        return minRet;
    }