LeetCode--No.560--Subarray Sum Equals K

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

 

Note:

  1. The length of the array is in range [1, 20,000].
  2. The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].

 

刷出來之後居然還洋洋自得覺得自己真厲害
後來發現我寫了個o(n^2), 這和brute force有什麼區別!!空間複雜度分明可以O(1), 但是我居然用到了O(n), Shame on me!!

class Solution {
    public int subarraySum(int[] nums, int k) {
        if (nums == null || nums.length == 0) return k == 0 ? 1 : 0;
        int[] res = new int[nums.length];
        if (nums[0] == k)   res[0] = 1;
        else    res[0] = 0;
        for(int i = 1; i < nums.length; i++){
            int count = 0;
            int sum = 0;
            for(int j = i; j >= 0; j--){
                sum += nums[j];
                if (sum == k)   count++;
            }
            res[i] = res[i-1] + count;
        }
        return res[nums.length - 1];
    }
}

如果要優化到比較好的O(n)的思路。

自然要從空間複雜度下手,那必須要存儲一些中間結果,那麼就是中間結果該怎麼保存的問題。
我是沒想明白,答案是這麼說的
Sum(i, j ) = Sum(0, j) - Sum(0, i-1) 
哎,靠譜啊,再寫一版吧。

改良版本

class Solution {
    public int subarraySum(int[] nums, int k) {
        if (nums == null || nums.length == 0) return k == 0 ? 1 : 0;
        Map<Integer, Integer> map = new HashMap<>();
        int sum = 0;
        int count = 0;
        map.put(0, 1);
        for(int i = 0; i < nums.length; i++){
            sum += nums[i];
            count += map.getOrDefault(sum - k, 0);
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}

btw, 我煲的牛尾雜蔬湯可真好喝啊

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