57 分类: Leetcode,算法

560.和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 _该数组中和为 k 的连续子数组的个数 _。

示例 1:

**输入:** nums = [1,1,1], k = 2
**输出:** 2

示例 2:

**输入:** nums = [1,2,3], k = 3
**输出:** 2



提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

思路:在循环中计算前缀和sum,若sum[i] - k已经在map中,说明有一个子数组和为k,然后将当前前缀和加入到map中

public class Solution {
    public int subarraySum(int[] nums, int k) {
         //int[] nums={1,2,-1,1,-1,3}; k=2
                    //1,3,2,3,2,5
        //注意!!!前缀和中(子数组)出现两处3-1=k,则Map更新为(3,2),
                   说明前缀和中3出现了两次,后续5-3=k,则ans+=2
        
        Map<Integer, Integer> map = new HashMap<>();
        //防止第一个数就为子数组
        map.put(0,1);
        int ans=0,sum=0,i,j=0;
        while(j<nums.length){
            sum+=nums[j];
            if(map.containsKey(sum-k))
                ans+=map.get(sum-k);
            map.put(sum,map.getOrDefault(sum,0)+1);
            j++;
        }
        return ans;
    }
}

#none

作者: zyk的zone

版权: 除特别声明,均采用BY-NC-SA 4.0许可协议,转载请表明出处

目录Content

-->