1. 程式人生 > >【LeetCode】最短子陣列之和(Minimum size subarray sum)

【LeetCode】最短子陣列之和(Minimum size subarray sum)

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.

For example, given the array [2,3,1,2,4,3] and s = 7, the subarray [4,3] has the minimal length under the problem constraint. 【題目】 給定一個數組包含n個正整數,再給定一個整數s,找出最短長度的連續子陣列,使該子陣列的和sum滿足sum≥s,如果不存在滿足條件的情況則返回0。 例如:[2, 3, 1, 2, 4, 3]     7 輸出:2 該輸出對應的子陣列為[4, 3]。 【思路】 兩個指標,start和end。end向後走直到sum大於s。然後start向後,直到sum小於s。同時更新min值。

【Code】

public class MinimumSizeSubarraySum {
    public int minSubArrayLen(int s, int[] nums) {
        //兩個陣列索引
        int start = 0;
        int end = 0;

        int sum = 0;//計運算元陣列和
        int min = Integer.MAX_VALUE;//儲存最小子陣列長度

        while(start < nums.length && end < nums.length) {
            while(sum < s && end < nums.length) {
                sum += nums[end++];//相加直到和大於等於s
            }
            while(sum >= s && start <= end) {
                min = Math.min(min, end-start);//記錄最短長度
                sum -= nums[start++];//sum減去子陣列頭,start前移
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }
}