Subarray sum

看似簡單的一題.....其實考點蠻多的

首先,有關 array sum的,幾乎都會用到 prefix sum

算出 prefix sum 後,我們可以想一下,怎樣的情況是某個區間相加為 0?

假設有一個 prefix sum 是 [2, 3, 4, 0, 4, 5]

我們看到 0 ,表示從第一個加到 0 那個位置的和為 0,那這樣就是一組答案

再來,我們發現有重複的兩個數字 4, 4

那麼表示從第一個 4 的後一個元素加到下一個 4 的和為 0

證明: prefix sum = [...A, B, C...]

C 是 A 後面元素的和,既然 A = C 那就表示 A 後面的元素加到 C 是 0 啊!

不然C的結果一定不會跟 A 一樣,這樣又找到另一組解

解法是用一個 map 來看看有沒有重複的元素

有重複,就把儲存起來的 index 當答案,因為儲存起來的 index 表示的是上面的 A,

放進答案時要 +1 ,因為是從後一個開始加的時候為 0

這也是為何一開始要放進 (0, -1) 這組,因為要避免 nums = [0] 跑不過

public List<Integer> subarraySum(int[] nums) {
    List<Integer> result = new ArrayList<>();
    if (nums == null || nums.length == 0) {
        return result;
    }

    Map<Integer, Integer> map = new HashMap<>();
    map.put(0, -1);

    int sum = 0;
    for (int i=0; i<nums.length; i++) {
        sum = sum + nums[i];
        if (map.containsKey(sum)) {
            result.add(map.get(sum)+1);
            result.add(i);
            break;
        }
        map.put(sum, i);
    }
    return result;
}

複雜度 O(n)

results matching ""

    No results matching ""