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

The length of the array is in range [1, 20,000].

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

老规矩,先来一个暴力破解的方法,遍历求累加和,判断是否为n,一看代码就能明白,如下:

public int subarraySum(int[] nums, int k) {
    int count = 0;
    for (int i = 0; i < nums.length; i++) {
        int sum = nums[i];
        if (sum == k) count++;
        for (int j = i + 1; j < nums.length; j++) {
            sum += nums[j];
            if (sum == k) count++;
        }
    }
    return count;
}

上述方法其实也能accept,执行结果如下:可以看到耗时还是比较长的

执行耗时:112 ms,击败了27.18% 的Java用户 内存消耗:38.6 MB,击败了98.91% 的Java用户

方法二:

想到网上一种传统的解决这种问题的思路,利用一个累加和数组,其实思路比较简单,但是还不如暴力来得快呢

public int subarraySum(int[] nums, int k) {
    int[] sums = new int[nums.length];
    sums[0] = nums[0];
    for (int i = 1; i < nums.length; i++) {
        sums[i] = sums[i - 1] + nums[i];
    }
    int count = 0;
    for (int i = 0; i < sums.length; i++) {
        if (sums[i] == k) {
            count++;
        } else {
            for (int j = 0; j < i; j++) {
                if (sums[i] - sums[j] == k) {
                    count++;
                }
            }
        }

    }
    return count;
}

方法三:

利用一个map保存当前累加和的值,和对应的count,但是在求解时还需要注意,我并没有理解透彻。可以看下代码,然后手动推导 过程:

public int subarraySum(int[] nums, int k) {    
    int count = 0, sum = 0;
    Map<Integer, Integer> map = new HashMap<>();
    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;
}

用map的查找功能来代替遍历数组(字符串)是一个常用的节省时间的方案,一旦需要频繁查找的时候,都可以往map上想一想。

结果是: 执行耗时:15 ms,击败了44.44% 的Java用户 内存消耗:38.4 MB,击败了98.91% 的Java用户