美文网首页
560. 和为 K 的子数组

560. 和为 K 的子数组

作者: 名字是乱打的 | 来源:发表于2021-12-28 00:00 被阅读0次

一 题目

二 思路:

  • 1.暴力枚举--时间复杂度N2,不推荐,由于存在Nums[i]<0,因此我们需要从每个位置开始到数组最后都进行判断,不可达到目标就提前中值;
  • 2.前缀树-时间复杂度N2,不推荐 先计算出前i项的合,这样加快了暴力破解计算和的过程;
  • 3.前缀树+hash
    • 假设区间[left, right]的和为k,即前right项的和-前left项的和=k,换句话说就是:前left项之和=前right项之和-k.
    • 因此我们可以遍历一遍数组,记录下前i项的和sum,用Map的健存储sum,Map的值存储sum出现的次数。
    • 假设当前扫到第i位,记录它的前i项和sum,用该和减去k,即sum-k,判断sum-k是否为某个位置的前n项和,若是,更新统计量。

三 代码:

暴力

class Solution {
    int count=0;

    //暴力法
    public int subarraySum(int[] nums, int k) {

        for (int i = 0; i < nums.length; i++) {
            int sum=0;
            for (int j = i; j < nums.length; j++) {
                sum+=nums[j];
                if (sum==k){
                    count++;
                }
            }
        }
        return count;
    }
}

前缀树

class Solution {
    int count=0;

    public int subarraySum(int[] nums, int k) {
        //存储从0~i项的和
        int[] sumArr=new int[nums.length+1];

        //存储值
        for (int i = 1; i < nums.length; i++) {
            sumArr[i]=sumArr[i-1]+nums[i-1];
        }

        for (int left = 0; left < nums.length; left++) {
            //第1~第k项
            for (int right = left+1; right <= nums.length; right++) {
                int sum=sumArr[right]-sumArr[left];
                if (sum==k){
                    count++;
                }
            }
        }
        return count;
    }

}

前缀树+hashmap

 class Solution {
    public int subarraySum(int[] nums, int k) {
        int count=0;
        Map<Integer, Integer> map = new HashMap<>();
        int sum=0;
        //如果前缀和直接等于K的话,即sum-k=0的时候我们需要赋初值,就是1。
        map.put(0, 1);
        for (int i=0; i<nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum-k)) {
                count += map.get(sum-k);
            }
            if (map.containsKey(sum)) {
                map.put(sum, map.get(sum) + 1);
            } else {
                map.put(sum, 1);
            }
            
        }
        return count;
    }
}

相关文章

  • leetcode 560. 和为K的子数组

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

  • 前缀和

    560.和为K的子数组 算出一共有几个和为 k 的子数组。这里用到了前缀和数组。 注意以下几点: 前缀和数组第0号...

  • 那些小而美的算法技巧:前缀和/差分数组

    读完本文,你可以去力扣拿下如下题目: 560.和为K的子数组[https://leetcode-cn.com/pr...

  • 560. 和为K的子数组

    【Description】给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例...

  • 560.和为K的子数组

    和为K的子数组 题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1...

  • 560.和为K的子数组

    思路: 用sum[i]表示a[0]~a[i]的和,若sum[j]-sum[i]==k的话,则计数+1 注意: 若s...

  • 560. 和为K的子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums ...

  • 560. 和为 K 的子数组

    解法 暴力解法,双重遍历。 前缀和解法,对于连续类树和数组都很好用

  • 560. 和为 K 的子数组

    一 题目 二 思路: 1.暴力枚举--时间复杂度N2,不推荐,由于存在Nums[i]<0,因此我们需要从每个位置开...

  • LeetCode 560. 和为 K 的子数组

    题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。 例:输入...

网友评论

      本文标题:560. 和为 K 的子数组

      本文链接:https://www.haomeiwen.com/subject/rzsuqrtx.html