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题是存储的当前累加和的余数与第一次出现这个余数的位置
325题存储的是当前累加和与第一次出现这个和的位置
其实561与325都是求的最长长度,那就一定要存储的是第一次出现满足要求的位置,中间可能还出现这种满足要求的情况,但都不能进行存储
560. Subarray Sum Equals K
求和为k的连续子数组的个数
http://www.cnblogs.com/grandyang/p/6810361.html
如果当前的累加和减去k能找到值,一定是子数组。因为子数组一定是减去前面的值,累加和其实就是看到底减去几个值。
初始化的目的:如果当前位置和为k,那差值就是0,但是存储的值却是sum,不一定存储了0的值。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> m;
m[] = ;
int sum = ,res = ;
for(int i = ;i < nums.size();i++){
sum += nums[i];
res += m[sum - k];
m[sum]++;
}
return res;
}
};
523. Continuous Subarray Sum
思路和560. Subarray Sum Equals K有些类似,因为都是找之前经过的数组的情况,只是560. Subarray Sum Equals K是和。一次循环,加每个数值,然后求余数,如果当前求余数在之前出现过,那当前的数减去之前的子数组的数就可以弥补。
错误解法:
如果一个数在hash_map中没有存储,比如10,使用m[10]不是不返回结果,而是返回0,这个0不代表value值,而是代表没有这个存储。这也是为什么下面这个代码在i = 2时就出错了,i=2时虽然hash_map中没有,但返回0,使得i - 0大于了1
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
unordered_map<int,int> m;
m[] = -;
int sum = ;
for(int i = ;i < nums.size();i++){
sum += nums[i];
int tmp = (k == ) ? sum : sum%k;
if(i - m[tmp] > )
return true;
m[tmp] = i;
}
return false;
}
};
注意1.这个地方m.count(tmp) == 1的时候不要去更新m[tmp] = i,因为这样不能得到最长的长度,去判断有没有至少2个的时候,应该用最远位置去判断。
2. i - (i - 1) >= 1其实就能表示有两个数字,但是这里是需要减去之前的所有,所以必须是i - 1
正确解法:
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
unordered_map<int,int> m;
m[] = -;
int sum = ;
for(int i = ;i < nums.size();i++){
sum += nums[i];
int tmp = (k == ) ? sum : sum%k;
if(m.count(tmp)){
if(i - m[tmp] > )
return true;
}
else
m[tmp] = i;
}
return false;
}
};
325.Maximum Size Subarray Sum Equals k
这个题与523一样unordered_map中只需要保存第一个出现的位置,但保存的是sum,不是target,注意!
注意,你查找的时候是查找sum-k,如果查不到应该分为两种情况,即当前sum在map中有没有值。因为实际上这里是从左向右遍历,只要你找到第一个等于某个sum的,这个值就能成为你需要的最长的子数组。
class Solution {
public:
/**
* @param nums: an array
* @param k: a target value
* @return: the maximum length of a subarray that sums to k
*/
int maxSubArrayLen(vector<int> &nums, int k) {
// Write your code here
unordered_map<int,int> m;
m[] = -;
int res = ;
int sum = ;
for(int i = ;i < nums.size();i++){
sum += nums[i];
if(m.find(sum - k) != m.end()){
res = max(res,i - m[sum-k]);
}
else{
if(m.find(sum) != m.end())
continue;
else
m[sum] = i;
}
}
return res;
}
};
leetcode 560. Subarray Sum Equals K 、523. Continuous Subarray Sum、 325.Maximum Size Subarray Sum Equals k(lintcode 911)的更多相关文章
- [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 325. Maximum Size Subarray Sum Equals k
原题链接在这里:https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/ 题目: Given an array nums an ...
- 【LeetCode】325. Maximum Size Subarray Sum Equals k 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 prefix Sum 日期 题目地址:https:// ...
- 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 ...
- 325. Maximum Size Subarray Sum Equals k
最后更新 二刷 木有头绪啊.. 看答案明白了. 用的是two sum的思路. 比如最终找到一个区间,[i,j]满足sum = k,这个去见可以看做是 [0,j]的sum 减去 [0,i]的Sum. 维 ...
- [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 ...
- 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 Maximum Size Subarray Sum Equals k
原题链接在这里:https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/ 题目: Given an array nums an ...
随机推荐
- <s:bean>标签的使用
今天在使用<s:bean>时出了一个问题,感觉有意思的就记录下来吧,以备学习 在使用这个标签的时候需要注意两个事项: 1.<s:bean>的三个属性 id,name,var,在 ...
- C#中设置密码框 ,用符号代替密码
添加控件 添加控件 确认键代码 private void button1_Click(object sender, EventArgs e) { //修改密码.新密码,重复新密码,两次输入的新密码必须 ...
- JVM指令集[转]
http://blog.csdn.net/tccth4091/article/details/5833103 http://www.cnblogs.com/rollenholt/articles/21 ...
- webpack中环境变量的使用方法
这节课讲解一下,在webpack打包过程中,怎么去使用一些环境变量. 首先我有一个打包配置的三个文件 "scripts": { "dev-build": &qu ...
- C++ 输出PPM格式图片文件
PPM简介 学习图形学时为了直观地观察结果,需要输出图片,而PPM是一种最简单的图片格式,非常适合新手使用. PPM文件的内容大概是这样的: 第一行固定为P3,代表写入的是PPM格式的RGB图像,除此 ...
- bp算法推导过程
参考:张玉宏<深度学习之美:AI时代的数据处理与最佳实践>265-271页
- #使用Python的turtle绘制正六边形、叠边形
1.#Python的turtle绘制正六边形 代码: len=100 #表示边长像素 import turtle as t #正六边形内角都是120度,外角60度 for i in range(6): ...
- SP703 SERVICE - Mobile Service[DP]
题意翻译 Description 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.只有被请求后,他才能移动,不允许在同 ...
- JAVA遇见HTML——JSP篇:JSP基础语法
动态网页和静态网页的区别: 静态网页 表现形式:网页中的内容是固定,不会更新. 所需技术:HTML,CSS 动态网页 表现形式:网页中的内容通过程序动态显示的,自动更新. 所需技术:HTML,CSS, ...
- Oracle 中文转字母 函数
CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE V ...