1. 程式人生 > >LintCode-和大於S的最小子陣列

LintCode-和大於S的最小子陣列

給定一個由 n 個整陣列成的陣列和一個正整數 s ,請找出該陣列中滿足其和 ≥ s 的最小長度子陣列。如果無解,則返回 -1。

您在真實的面試中是否遇到過這個題?  Yes 樣例

給定陣列 [2,3,1,2,4,3] 和 s = 7, 子陣列 [4,3] 是該條件下的最小長度子陣列。

思路:陣列的題一般思路大概是用兩個指標掃描,這裡是用一前一後兩個指標都從左往右移,前面的指標一直移直到和大於s為止;後面的指標此時一直右移,直到距離最短為止。最後返回最小子陣列的大小,也就是最小子陣列中元素個數。

程式碼如下:

public class Solution {
    /**
     * @param nums: an array of integers
     * @param s: an integer
     * @return: an integer representing the minimum size of subarray
     */
    public int minimumSize(int[] nums, int s) {
           if(nums == null || nums.length == 0)
                     return -1;
            int end =0;
            int start = 0;
            int sum = 0;
            int res = Integer.MAX_VALUE;
        while(end < nums.length){
           sum +=nums[end];
           if(sum >= s){
              res = Math.min(res,end-start+1);
              //當掃描到陣列和大於s時,從第一個元素逐次縮小陣列大小,
                  //直到符合條件的最小子陣列
              while(sum >= s && start <= end){   
                  res = Math.min(res,end-start+1);
                  sum-=nums[start];
                   start++;
                    }
                 }
           end++;  //當前子陣列的和還小於s,end往後移
        }
        if(res == Integer.MAX_VALUE ){   //需要考慮溢位問題
           return -1;
        }
        return res;
    }
}