leetcode top100(10) 和为 K 的子数组

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

子数组是数组中元素的连续非空序列。

示例 1:

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

示例 2:

输入:nums = [1,2,3], k = 3
输出:2
package TOP1_10;

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

/**
 * 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
 *
 * 子数组是数组中元素的连续非空序列。
 *
 *
 *
 * 示例 1:
 *
 * 输入:nums = [1,1,1], k = 2
 * 输出:2
 * 示例 2:
 *
 * 输入:nums = [1,2,3], k = 3
 * 输出:2
 */
public class Top10 {
    //采用最左前缀法 一个hash表中存入前面数据之和,遍历数据只要hash表中存在当前数据和t - k 那么就有哈希表中对应个数的连续数组和为K

    private  static int getCount(int[] nums,int k){
        Map<Integer,Integer> preSumMap = new HashMap<>();

        int presum = 0 ;
        int count = 0;
        preSumMap.put(0,1);
        for(int num:nums){
            presum = presum + num;
            if(preSumMap.containsKey(presum-k)){
                count = count +preSumMap.get(presum-k);
            }

            preSumMap.put(presum,preSumMap.getOrDefault(presum,0)+1);
        }
        return count ;
    }

    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,1,2,3,5,4};
        System.out.println(getCount(nums,6));
    }
}

猜你喜欢

转载自blog.csdn.net/harryptter/article/details/132885750