【LeetCode-中等题】560. 和为 K 的子数组

题目

【LeetCode-中等题】560. 和为 K 的子数组_第1张图片
【LeetCode-中等题】560. 和为 K 的子数组_第2张图片

题解一:逆序枚举数组

【LeetCode-中等题】560. 和为 K 的子数组_第3张图片

//方法一:枚举数组(顺序)
   int count= 0;// 记录最终符合条件的数组个数
   int n = nums.length;
   for(int end = 0; end<n ; end++){
     int sum = 0;//记录每一次经过的元素总和
     for(int start = end; start>=0;start--){
         sum += nums[start];
         if(sum == k)  count++;
     }
   }
   return count;

题解二:map+前缀和

【LeetCode-中等题】560. 和为 K 的子数组_第4张图片
为什么map里面要存前缀和的次数,因为前缀和不一定是越加越大的,因为数组元素存在负数,所以会导致出现重复的前缀和。这样满足条件的子数组也会有多个
【LeetCode-中等题】560. 和为 K 的子数组_第5张图片

// 方法二:map+前缀和
        int count = 0, pre = 0;
        HashMap < Integer, Integer > mp = new HashMap < > ();
        mp.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];
            if (mp.containsKey(pre - k)) {//若前缀和 - k  在map存在,说明有满足条件的数组构成的前缀和
                count += mp.get(pre - k);
            }
                //若前缀-k不存在集合中,就照常将前缀和为key   出现次数为value(初始为1.后续++)
              if(mp.containsKey(pre))  mp.put(pre,mp.get(pre)+1);
              else mp.put(pre , 1);
          
        }
        return count;

你可能感兴趣的:(#,中等题,力扣,leetcode,java,算法)