【Leetcode】560. Subarray Sum Equals K

题目地址:

https://leetcode.com/problems/subarray-sum-equals-k/

给定一个数组,再给定一个数 k k k,问这个数组中有多少个子数组其和为 k k k

容易想到用前缀和。遍历前缀和的同时可以用一个哈希表记录每个前缀和出现了多少次,同时做计数即可。代码如下:

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int subarraySum(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        int[] preSum = new int[nums.length + 1];
        for (int i = 0; i < nums.length; i++) {
            preSum[i + 1] = preSum[i] + nums[i];
        }
        
        int res = 0;
        // key代表前缀和,value代表该前缀和出现的次数
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < preSum.length; i++) {
        	// 如果前缀和preSum[i] - k出现过,说明存在子数组和为k,就累加进res
            if (map.containsKey(preSum[i] - k)) {
                res += map.get(preSum[i] - k);
            }
            // 更新前缀和出现的次数
            map.put(preSum[i], map.getOrDefault(preSum[i], 0) + 1);
        }
        
        return res;
    }
}

时空复杂度 O ( n ) O(n) O(n)

你可能感兴趣的:(#,数组,链表与模拟)