当前位置:网站首页>【LeetCode】Day108-和为 K 的子数组
【LeetCode】Day108-和为 K 的子数组
2022-07-31 09:59:00 【倒过来是圈圈】
题目
题解
枚举法
实际上就是暴力计算,双重循环
class Solution {
public int subarraySum(int[] nums, int k) {
int n=nums.length;
int count=0;
for(int i=0;i<n;i++){
int sum=0;
for(int j=i;j<n;j++){
sum+=nums[j];
if(sum==k)
count++;
}
}
return count;
}
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
前缀和+哈希表
这个逻辑非常的妙
首先,基于方法一,对于每一个 i ,我们都要枚举 j 来判断是否符合条件,这个过程是否可以用数据结构精简呢?
我们定义 pre[i] 为 [0…i] 里所有数的和,则 pre[i] 可以由 pre[i−1] 递推而来,即 p r e [ i ] = p r e [ i − 1 ] + n u m s [ i ] pre[i]=pre[i−1]+nums[i] pre[i]=pre[i−1]+nums[i]
那么「[j…i] 这个子数组和为 k 」这个条件我们可以转化为 p r e [ i ] − p r e [ j − 1 ] = = k , pre[i]−pre[j−1]==k, pre[i]−pre[j−1]==k,再进行简单移项,得到 p r e [ j − 1 ] = = p r e [ i ] − k pre[j−1]==pre[i]−k pre[j−1]==pre[i]−k
所以我们考虑 i 有多少个前缀和为 pre[i]−k 的 pre[j] 即可。
其次,建立哈希表mp,以 和-次数 为键值对,记录 pre[i] 出现的次数,从左往右边更新 mp 边计算答案,那么以 i 结尾的答案 mp[pre[i]−k] 即可在 O(1) 时间内得到
进一步优化,由于pre[i]只和pre[i-1]有关,因此可以不用建立pre数组,直接用变量pre来记录答案。
class Solution {
public int subarraySum(int[] nums, int k) {
int n=nums.length;
int pre=0,count=0;
Map<Integer,Integer>mp=new HashMap<>();
mp.put(0,1);//0->i前缀和数组 恰好为k的情况,做一个初始化
for(int i=0;i<n;i++){
pre+=nums[i];
if(mp.containsKey(pre-k))
count+=mp.get(pre-k);
mp.put(pre,mp.getOrDefault(pre,0)+1);
}
return count;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
边栏推荐
- NowCoderTOP23-27 Binary tree traversal - continuous update ing
- loadrunner录制问题
- js radar chart statistical chart plugin
- Kotlin—基本语法 (四)
- 【软考软件评测师】2012综合知识历年真题
- Qt 编译错误:C2228: “.key”的左边必须有类/结构/联合
- 【微信小程序开发】生命周期与生命周期函数
- 一些计时软件,生产力工具
- matlab 读取csv文件绘图
- Flink1.15 source code reading - PER_JOB vs APPLICATION execution process
猜你喜欢

js右侧圆点单页滚动介绍页面

js department budget and expenditure radar chart

djangoWeb应用框架+MySQL数据4

A Spark SQL online problem troubleshooting and positioning

数据中台建设(六):数据体系建设

loadrunner-controller-场景执行run

Come n times - 07. Rebuild the binary tree

js实现2020年元旦倒计时公告牌

Mybaits Frequently Asked Questions Explained

Source code analysis of GZIPInputStream class
随机推荐
VMware下安装win10启动后进入Boot Manger界面如何解决
梅科尔工作室--鸿蒙十四天开发培训笔记(八)
postgresql generate random date, random time
踩水坑2 数据超出long long
VMware下安装win10
来n遍剑指--07. 重建二叉树
GVINS论文阅读笔记
开放麒麟 openKylin 自动化开发者平台正式发布
js right dot single page scrolling introduction page
loadrunner脚本--添加事务
内联元素居中
前序、后序及层次遍历实现二叉树的序列化与反序列化
Dart Log工具类
[ 动词词组 ] 合集
Gradle series - Groovy overview, basic use (based on Groovy document 4.0.4) day2-1
postgresql 生成随机日期,随机时间
spark filter
【节选】吴恩达给出的AI职业生涯规划
loadrunner-controller-目标场景Schedule配置
SQLite3交叉编译