LeetCode--560. 和为K的子数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :

数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

刚开始看到的时候想到了用HashMap记录前n项和,以及用当前前n项和减去之前任意的,如果有值为k,那么就有一组存在,但是我没想到的是map<key,val>中的key是用和,val是该和出现的次数,导致于一下没想出来。暴力破解谁都会,关键还是Map的应用吧。

代码是暴力和Map两种

 //暴力破解
    public int subarraySum(int[] nums, int k) {
        int res = 0;
        int numLength = nums.length;
        for (int i = 0; i < numLength; ++i){
            int tmpVal = 0;
            for (int j = i; j < numLength; ++j){
                tmpVal += nums[j];
                if (tmpVal == k)
                    res++;
            }
        }
        return res;
    }
    //优化后的方法
    public int subarraySum1(int[] nums, int k){
        int res = 0;
        int indexVal = 0;
        HashMap<Integer, Integer> numsMap = new HashMap<Integer, Integer>();
        numsMap.put(0,1);
        for (int num : nums){
            indexVal += num;
            int tmpVal = 0;
            tmpVal = indexVal - k;
            if(numsMap.containsKey(tmpVal)){
                res += numsMap.get(tmpVal);
            }
            if (numsMap.containsKey(indexVal)){
                numsMap.put(indexVal,numsMap.get(indexVal) + 1);
            }else {
                numsMap.put(indexVal,1);
            }
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/106154951