zoukankan      html  css  js  c++  java
  • 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].

    解法:hashmap + prefix sum (cummulative sum)

    prefix sum:

    prefixsum[x] = sum of subarray(0, x) = nums[0] + ... + nums[x] = prefixsum[x-1] + nums[x]

    e.g. index      0  1  2

      nums      [1, 1, 1]

      prefix sum [0, 1, 2, 3]    sum of subarray(i, j) = prefixsum[j] - prefixsum[i-1]

    用了prefix sum,问题就转化为 j > i时,求有多少对<i, j>满足 prefixsum[j] - prefixsum[i-1] = k -> prefixsum[j]  - k = prefixsum[i-1]

    detail:

    用hashmap存 连续子数组之和(sum = nums[0] + ... + nums[i]) 及其出现次数,以便查找sum-k出现的次数(有多少prefix sums等于sum - k,nums[0] + ... + nums[j] = sum - k,就有相同数目的prefix sums,nums[j+1] + ... + nums[i] = k)。

    遍历nums中元素,累加当前元素更新sum,在map中查找key=sum-k出现的次数(即,在遍历过的数组元素中,prefixsum[i-1] = prefixsum[j]  - k 出现的次数),然后更新当前prefixsum在map中的次数。

    注意:map初始化,map.put(0, 1)!即当sum刚好等于k的时候,从数组下标为0到当前位置这一子数组的和就是k,也符合题意。

    时间:O(N),空间:O(N)

    class Solution {
        public int subarraySum(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            int sum = 0, res = 0;
            map.put(0, 1);
            for(int i = 0; i < nums.length; i++) {
                sum += nums[i];
                res += map.getOrDefault(sum - k, 0);
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
            return res;
        }
    }
  • 相关阅读:
    软件测试第五次作业
    第四次博客作业(第一题)
    实验二
    安全开发
    代码审计入门
    破壳笔记-渗透测试
    Libra的思考
    深度学习构建视频人脸识别模型
    tensorflow
    数据结构(长期)
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10052251.html
Copyright © 2011-2022 走看看