560. 和为K的子数组
Q:
A:
1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3。
2.n^2解法
从1~n-1各起点开始,一直找到结尾,n^2
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int res=0;
for(int i=0;i<nums.size();++i){
int sum=0;
for(int j=i;j<nums.size();++j){
sum+=nums[j];
if(sum==k){
res+=1;
}
}
}
return res;
}
};
或者
保存前i个元素的和,子数组共有n^2种,对于i到j的子数组,可以用sum[j]-sum[i-1]求得,也是n ^2
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
if(nums.empty()){return 0;}
int siz=nums.size(),res=0;
vector<int> sum(siz,0);
sum[0]=nums[0];
for(int i=1;i<siz;++i){
sum[i]=sum[i-1]+nums[i];
}
for(int i=0;i<siz;++i){
for(int j=i;j<siz;++j){
if(i>0 and sum[j]-sum[i-1]==k){
res+=1;
}
else if(i==0 and sum[j]==k){
res+=1;
}
}
}
return res;
}
};
3.O(N)解法,这个我没想出来,是用哈希表模拟动态规划的一个做法。
建一个map,i从0到n-1,对于所有从0开始到i的元素和都加入map,键为元素和,值为出现次数。
下面考虑任何一个所求解,假设左边界i,右边界j,i到j子数组的元素和为k。
那么就有前j项和减前i-1项和等于k,但是对于所有可能的i,j组合还是有n^2种可能。这里是利用map取指定键的对应值时间是O(1)。遍历到i时,即已经求出前i项元素和所有j(j<i)的前j项和。那么我们直接去map里查sum[i]-k在不在map里,在的话说明存在j(j<i)满足,sum[j]=sum[i]-k。 那么显然j+1到i的子数组的元素和就是k。当然如果sum[i]-k的值不止为1,说明有多个j(j<i)满足sum[j]=sum[i]-k,也就是有多个不同的j到i子数组满足元素和为k。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
map<int,int> dic;
dic[0]=1;
int sum=0,res=0;
for(int i=0;i<nums.size();++i){
sum+=nums[i];
res+=dic[sum-k];//这步在前
dic[sum]+=1;//这步在后,可能k==0,颠倒上下语句顺序会多算一个
}
return res;
}
};
560. 和为K的子数组的更多相关文章
- 【LeetCode】560. 和为K的子数组
560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...
- 力扣 - 560. 和为K的子数组
目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路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 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...
- 力扣题解-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的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)
public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...
- 【python-leetcode713-双指针】乘积小于k的子数组
问题描述: 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于10 ...
随机推荐
- asp.net core 配置文件动态更新
IOptions<T> //站点启动后,获取到的值永远不变 IOptionsSnapshot<T> //站点启动后,每次获取到的值都是配置文件里的最新值 (reloadOnCh ...
- jQuery---美女相册案例
美女相册案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- Mysql快速入门(二)
多表关联查询 JOIN 按照功能大致分为如下三类: CROSS JOIN(交叉连接) INNER JOIN(内连接或等值连接). OUTER JOIN(外连接) 交叉连接 交叉连接的关键字:CROSS ...
- yii2 环境切换(开发,正式)
方式一,在web中index修改 开发环境配置 web目录index.php defined('YII_DEBUG') or define('YII_DEBUG', true); defined('Y ...
- setTimeout(call,0)作用
setTimeout(call,0)作用 经常看到setTimeout延时0ms的javascript代码,感到很迷惑,难道延时0ms和不延时不是一个道理吗?后来通过查资料以及实验得出以下两个作用, ...
- Selenium3+python自动化010-UnitTest框架简介和单元测试框架使用
一.UnitTest介绍 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过, ...
- 【数据结构】【C++】堆栈的实现与应用
堆栈(Stack) 参考浙大版<数据结构(第2版)> 堆栈可以认为是具有一定约束的线性表,插入和删除的操作都在栈顶的位置,先进入的元素将在后进入的元素之后取出,与生活中的桶类似,故又称为后 ...
- 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式
[学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- HTML的文档设置标记
1.格式标记 <br/> 强制换行标记 <p> 换段落标记 换段落,由于多个空格和回车在HTML中会被等效为一个空格,所以HTML中要换段落就要用<p>,<p ...
- TP-网页静态化
首先放上一张某手册中的一段代码: 我们要想在TP框架中执行网页静态化,在这段代码的基础上稍加添加就可以了: 在TP5框架中,为了方便寻找模板文件与生成的静态文件,我们将模板文件以及生成的静态文件放在p ...