力扣 - 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的子数组的更多相关文章
- LeetCode——560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...
- 【LeetCode】560. 和为K的子数组
560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...
- 560. 和为K的子数组
Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...
- 力扣Leetcode 1248. 统计「优美子数组」
统计「优美子数组」 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 ...
- 力扣题解-560. 和为K的子数组
题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...
- 力扣Leetcode 560. 和为K的子数组
和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...
- Leetcode 560.和为k的子数组
和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1 ...
- LeetCode 560. 和为K的子数组(Subarray Sum Equals K)
题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...
- 【Leetcode】560. 和为K的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)
public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...
随机推荐
- 高阶函数 HOF & 高阶组件 HOC
高阶函数 HOF & 高阶组件 HOC 高阶类 js HOC 高阶函数 HOF 函数作为参数 函数作为返回值 "use strict"; /** * * @author x ...
- Chrome V8 系统架构
Chrome V8 系统架构 Chromium 多进程多线程架构 design-documents https://www.chromium.org/developers/design-documen ...
- Taro Advanced
Taro Advanced aro 代码与小程序代码混写 https://nervjs.github.io/taro/docs/hybrid.html https://github.com/NervJ ...
- css useful skills blogs
css useful skills blogs https://caniuse.com/ https://css-tricks.com https://css-tricks.com/almanac/p ...
- Java SE7虚拟机指令操作码助记符
本文转载自Java SE7 虚拟机指令操作码助记符 导语 在Class文件中,Java方法里的方法体,也就是代表着一个Java源码程序中程序的部分存储在方法表集合的Code属性中.存储在Code属性中 ...
- 《Activity显示界面历险记》—说说View的那些理不清的关系
前言 在Activity显示View的过程中,有一些重要的角色总让人理不清,比如PhoneWindow.DecorView.ViewRootImpl. 也常常有面试题会问到,他们四者之间的关系?创建的 ...
- tep环境变量、fixtures、用例三者之间的关系
tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地. 在tep项目中,自动化测试用例都是放到tests目录下的,每个 ...
- Python函数注解
目录 函数注解概述 实际应用 inspect模块 业务代码 总结 以下内容基于Python 3x 涉及的知识前提: 建议理解Python装饰器后学习此内容 函数注解概述 函数注解可以针对函数的参数.返 ...
- PHP代码审计_用==与===的区别
目录 背景介绍 如何审计 绕过案例1 绕过案例2 背景介绍 比较==与===的差别 == 是等于符号,=== 是恒等于符号,两个符号的功能都是用来比较两个变量是否相等的,只不过两个符号的比较维度不一样 ...
- 【Saas-export项目】--项目整合(spring整合MVC)
转: [Saas-export项目]--项目整合(spring整合MVC) 文章目录 Spring整合SpringMVC(export_web_manager子工程) (1)log4j.propert ...