【LeetCode】560. 和为K的子数组
560. 和为K的子数组
知识点:数组;前缀和;
题目描述
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
解法一:暴力法
直接以每个元素为首开始;
class Solution {
public int subarraySum(int[] nums, int k) {
int sum = 0;
int count = 0;
for(int i = 0; i < nums.length; i++){ //依次以元素开始;
for(int j = i; j < nums.length; i++){
sum += nums[j];
if(sum == k) count++;
}
sum = 0; //一次结束后归零;
}
return count;
}
}
时间复杂度:O(N^N);
解法二:前缀和
前缀和是很常见的一种解题思路,其含义就是高中学过的数列的前n项和;
所以如果我们要求哪个子序列和为k的话,就可以转化为求前缀和数组中哪两个的值相减等于k。这熟悉吗?对啊,这不就是两数之和那个题吗?还记得怎么做的吗?就是用哈希表存,key和value分别就是数值和其索引下标,为什么存索引下标,因为那个题让我们求的就是索引下标。那类比一下,这个题呢,这个题是让我们干嘛,是求有几项和,那我们的value就是对应的前n项和为某个值的有几个,这样减出来的子序列就有几个;
// 前缀和没有优化;
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0;
int[] premsum = new int[nums.length+1]; //比原数组长一位,第一位置为0;这样才能把nums[1]包括;
for(int i = 0; i < nums.length; i++){ //构建前缀和数组;
premsum[i+1] = premsum[i] + nums[i];
}
for(int i = 0; i < premsum.length-1; i++){
for(int j = i+1; j < premsum.length; j++){
if(premsum[j] - premsum[i] == k) count++;
}
}
return count;
}
}
时间复杂度:依然是O(N^N);
// 前缀和+哈希表;
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int premsum = 0;
int count = 0;
for(int i = 0; i < nums.length; i++){
premsum += nums[i]; //前缀和;
if(map.containsKey(premsum-k)) count += map.get(premsum-k);
map.put(premsum, map.getOrDefault(premsum, 0)+1); //前缀和为不同值的有几次;
}
return count;
}
}
时间复杂度:O(N);
体会
前缀和是一种很常用的思想,要对触发它的条件敏感 连续子数组+和,也就是用在哪一种题型里;
其次,哈希表也要敏感,比如在一个题目中有两数之和,那就要去用哈希表,可以利用其containsKey函数检索,从而少一次for循环;而哈希表中value的值就由我们要获得什么决定,比如此题是获得子数组的个数,那value就是每个和的次数;比如我们要获得子数组的大小或者下标,那value就是元素的索引,对症下药。
相关题目
1. 两数之和
930. 和相同的二元子数组
724. 寻找数组的中心下标
1248. 统计「优美子数组」
974. 和可被 K 整除的子数组
523. 连续的子数组和
【LeetCode】560. 和为K的子数组的更多相关文章
- LeetCode——560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入: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的子数组
和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...
- 560. 和为K的子数组
Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...
- 力扣 - 560. 和为K的子数组
目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...
- 【Leetcode】560. 和为K的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)
public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...
- 力扣题解-560. 和为K的子数组
题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...
- 【LeetCode】1248. 统计「优美子数组」
1248. 统计「优美子数组」 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. ...
随机推荐
- Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...
- VB 老旧版本维护系列---有点懵逼的webserver访问
有点懵逼的webserver访问 '定义webserver地址 Dim postUrl As String = "" '定义webserver所需xml字符串参数 Dim xmlR ...
- ng : 无法加载文件 C:\Users\szz\AppData\Roaming\npm\ng.ps1,因为在此系统上禁止运行脚本的解决方案
当安装好Angular CLI后想要查看该版本时在终端键入: ng version 后出现下图的错误提示 解决方案: 在win10 系统中有一个搜索框 输入 Windos PowerShell (一定 ...
- seldom 1.0 发布
seldom 是我几个月前重启的Web UI 自动化开源项目,源项目名 pyse, 基于 unittest 和 selenium 的自动化测试框架. seldom 1.0 做为第一个正式版做了以下改进 ...
- 徒手用 Go 写个 Redis 服务器(Godis)
作者:HDT3213 今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器.支持: 5 种数据结构(string.list.hash.set.sortedset) 自动 ...
- 为什么选择ASP.NET Core
什么是.NET 有一次小飞去面试,面试官上来就问了一个宏观的问题:"你觉得什么是.NET"?小飞的脑子嗡嗡的,支吾了半天,才吐了一些碎片化的词语:"跨平台.开源.微软-& ...
- Vue(6)v-on指令的使用
v-on 监听事件 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码.事件代码可以直接放到v-on后面,也可以写成一个函数.示例代码如下: <div id ...
- Vue前端基础学习
vue-cli vue-cli 官方提供的一个脚手架(预先定义好的目录结构及基础代码,咱们在创建Maven项目的时可以选择创建一个骨架项目,这个骨架项目就是脚手架),用于快速生成一个vue项目模板 主 ...
- C# 小知识点记录
1.当计算数据有小数点时不要使用float和double类型的数据,使用这两个会计算不准确.使用decimal 2.如果使用decimal计算数据,遇到除不进的数据有很多小数点的时候,在计算结果后面接 ...
- nohup启动 jar 不输出日志
简单暴力:nohup java -jar xxx.jar >/dev/null 2>&1 &