题目

560. 和为K的子数组

思路1(前缀和)

  • 构建前缀和数组,可以快速计算任意区间的和
  • 注意:计算区间时候,下标有变化,计算nums[i..j]之间的和,那么就是sum = prefixSum[j+1] - prefixSum[i],因为prefixSum的0索引位置是0,总的长度比nums大1

代码

class Solution {
public int subarraySum(int[] nums, int k) {
int[] prefixSum = new int[nums.length+1]; for (int i = 0; i < nums.length; i++) {
prefixSum[i+1] = prefixSum[i] + nums[i];
} int res = 0;
for (int i = 1; i <= nums.length; i++) {
for (int j = 0; j < i; j++) {
if (prefixSum[i] - prefixSum[j] == k) {
res++;
}
}
}
return res;
}
}

复杂度分析

  • 时间复杂度:\(O(N^2)\),其中 N 为数组长度
  • 空间复杂度:\(O(N)\),其中 N 为数组长度

思路2(前缀和+哈希表优化)

  • prefixSum[i] - prefixSum[j] = k 我们可以通过变形成 prefixSum[j] = prefixSum[i] - k
  • 由于只关心具体的次数,而不是解,所以我们可以用哈希表来记录前缀和出现的次数
  • 之前保存了相同前缀和的个数,所以再计算总区间的时候不是再去计算相加,而是符合条件直接从哈希表中找到出现的次数加到res中
  • 这样子时间复杂度就降到了\(O(N)\)了

代码

class Solution {
public int subarraySum(int[] nums, int k) {
HashMap<Integer, Integer> prefixSum = new HashMap<>();
prefixSum.put(0, 1);
int sumI = 0;
int res = 0; for (int i = 0; i < nums.length; i++) {
sumI += nums[i];
// 当前的前缀和(即从0...i)的值减去k,得到的值就是j..i区间的前缀和的值
int sumJ = sumI - k;
// 要查找的前缀和看看是否有存在,如果存在说明符合条件,就添加到res中
if (prefixSum.containsKey(sumJ)) {
res += prefixSum.get(sumJ);
}
// 每次把前缀和的及其出现的次数添加道哈希表中,如果不存在,就初始化为1,存在的话就加1即可
prefixSum.put(sumI, prefixSum.getOrDefault(sumI, 0) + 1);
} return res;
}
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为数组长度
  • 空间复杂度:\(O(N)\),其中 N 为数组长度

力扣 - 560. 和为K的子数组的更多相关文章

  1. LeetCode——560. 和为K的子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...

  2. 【LeetCode】560. 和为K的子数组

    560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...

  3. 560. 和为K的子数组

    Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...

  4. 力扣Leetcode 1248. 统计「优美子数组」

    统计「优美子数组」 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 ...

  5. 力扣题解-560. 和为K的子数组

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

  6. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  7. Leetcode 560.和为k的子数组

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

  8. LeetCode 560. 和为K的子数组(Subarray Sum Equals K)

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

  9. 【Leetcode】560. 和为K的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)

    public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...

随机推荐

  1. how to check SVG type in js

    how to check SVG type in js SVGSVGElement & SVGElement svg = document.querySelector(`svg`); // & ...

  2. js 大数计算

    js 大数计算 原理 JavaScript 安全整数 是 -253-1 ~ 253-1 ,即: -9007199254740991 ~ 9007199254740991; 换句话说,整数超过这个范围就 ...

  3. 观点纠正,yarn和npm对比,今天yarn仍然比npm快吗

    yarn和npm的区别和对比,网上很多了,不多说了. 只纠正一个观点:yarn仍然比npm快吗?不. 2016年,yarn刚刚发布,速度确实比npm快,于是网络上出现了好多推荐yarn的文章. 于是很 ...

  4. 11_MySQL如何让数据分页显示

    -- 数据分页 SELECT empno,sal FROM t_emp LIMIT 5;

  5. epoll 原理

    本文转载自epoll 原理 导语 以前经常被人问道 select.poll.epoll 的区别,基本都是靠死记硬背的,最近正好复习 linux 相关的内容,就把这一块做个笔记吧,以后也能方便查阅. e ...

  6. @RestController和@Controller

    1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面 若返回json等内容到页面,则需要加@ResponseBody注解 2 ...

  7. oracle中关键字的执行顺序

    执行顺序: from where group by having select order by ******当having/select 中出现组函数,那么其他没有被组函数修饰的列就必须出现下gro ...

  8. 生产者和消费者问题(synchronized、Lock)

    1.synchronized的生产者和消费者 synchronized是锁住对象 this.wait()释放了锁 并等待 this.notify()随机通知并唤醒同一个对象中的一个线程 this.no ...

  9. nginx判断状态脚本

    A是nginx行数 为0则启动nginx 启动失败则杀死keepalived进程

  10. SpringBoot读取配置文件的内容

    1.@Value读取 在springboot项目中,如果要读取配置文件application.properties或application.yml文件的内容,可以使用自带的注解@Value.以prop ...