LeetCode subarray-sum-equals-k题解 前缀和+Hash表+枚举——线性做法
文章目录
题意
给定一个数组,求连续的子数组的和为k的子数组个数。
思路
连续子数组的和sum[i,j]
sum[i,j]=∑k=ijAk(i<j)sum[i,j]=\sum_{k=i}^jA_k(i<j)sum[i,j]=∑k=ijAk(i<j)
即数组第i个数到第j个数的子数组的和。
sum[i,j]=sum[j]−sum[i−1]sum[i,j]=sum[j]-sum[i-1]sum[i,j]=sum[j]−sum[i−1]其中sum[i]sum[i]sum[i]是前i个数的前缀和。
另子数组的和固定为k,则右边两个数只需要每一个,就可以确定另一个数的取值。
假设我们把前一个sum的下标记为r,后一个记为l.
若我们枚举l,我们有了如下需求:
sum数组中,下标大于l且值为sum[l]+k的个数是多少?
因此我们可以控制l的枚举顺序为从后往前,并且用hash表维护自l往后的sum[i]中的所有<sum值,个数>以应对此查询并且快速更新hash表。
同理,可以从前往后枚举r,用hash表维护下标小于r的所有的<sum值,个数>……
源码
class Solution {
public int subarraySum(int[] nums, int k) {
int len = nums.length;
//key:sum,value:the count of sum[i] where i<r
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
map.put(0,1); // sum[-1]=0
int count = 0;
for (int r = 0,r_sum = 0;r < len; ++r) {
r_sum += nums[r];
int l_sum = r_sum-k;
if (map.containsKey(l_sum))
count += map.get(l_sum);
if (map.containsKey(r_sum))
map.put(r_sum,map.get(r_sum)+1);
else
map.put(r_sum,1);
}
return count;
}
}
结果记录
- 19ms
- 82.65%
- 40.1MB
- 100.0%
LeetCode subarray-sum-equals-k题解 前缀和+Hash表+枚举——线性做法的更多相关文章
- [LeetCode] Subarray Sum Equals K 子数组和为K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- LeetCode - Subarray sum equals k
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- leetcode 560. Subarray Sum Equals K 、523. Continuous Subarray Sum、 325.Maximum Size Subarray Sum Equals k(lintcode 911)
整体上3个题都是求subarray,都是同一个思想,通过累加,然后判断和目标k值之间的关系,然后查看之前子数组的累加和. map的存储:560题是存储的当前的累加和与个数 561题是存储的当前累加和的 ...
- Subarray Sum & Maximum Size Subarray Sum Equals K
Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...
- Subarray Sum & Maximum Size Subarray Sum Equals K && Subarray Sum Equals K
Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...
- [LeetCode] 560. Subarray Sum Equals K 子数组和为K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- LeetCode 560. Subarray Sum Equals K (子数组之和等于K)
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
随机推荐
- Angular常用命令
一. Angular常用命令 1. ng new 文件夹名 (新建项目,选择y使用路由) 2. ng serve --open (默认浏览器运行项目) 3. ng serve --port 6060 ...
- TCP三次握手四次挥手过程梳理
1. 数据传输的大致示意图 1.1 TCP数据报文首部内部 1.2 TCP连接的几种状态说明 即命令 netstat 结果中的所有状态: 2. TCP连接建立的全过程 2.1 TCP三次握手建立TCP ...
- (1) Q#学习笔记 - 第一章 QDK安装
2020/2/22,开始学习Q#. 第1章 QDK的安装 第1节 简介 QDK是Microsoft Quantum 开发工具包,可以进行量子编程,主要包含: Q# 编程语言 在 Q# 中对复杂功能进行 ...
- Android布局管理器-使用TableLayout表格布局管理器实现简单的用户登录页面
场景 Android布局管理器-使用FrameLayout帧布局管理器显示层叠的正方形以及前景照片: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- Android布局管理器-使用FrameLayout帧布局管理器显示层叠的正方形以及前景照片
场景 Android布局管理器-使用LinearLayout实现简单的登录窗口布局: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...
- 「Flink」使用Java lambda表达式实现Flink WordCount
本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> < ...
- PMP--0. 前言(闲言)
先说一句话给未来的自己:你一定会感谢你现在的努力,当你回看时,记得带着现在的心境和心愿.未来更好的明天. --2019.12.1禾木留 今天是正式发布的时间--2020.01.01,听着新年快乐的祝福 ...
- 如何在 vue 中添加权限控制管理?---vue中文社区
前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...
- Python中关于日期的计算总结
1.获取当前时间的两种方法: 代码如下: import datetime,timenow = time.strftime("%Y-%m-%d %H:%M:%S")print now ...
- 纪中10日T1 2313. 动态仙人掌
纪中10日 2313. 动态仙人掌 (File IO): input:dinosaur.in output:dinosaur.out 时间限制: 1500 ms 空间限制: 524288 KB 具 ...