整体上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)的更多相关文章

  1. [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 ...

  2. LeetCode 325. Maximum Size Subarray Sum Equals k

    原题链接在这里:https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/ 题目: Given an array nums an ...

  3. 【LeetCode】325. Maximum Size Subarray Sum Equals k 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 prefix Sum 日期 题目地址:https:// ...

  4. 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 ...

  5. 325. Maximum Size Subarray Sum Equals k

    最后更新 二刷 木有头绪啊.. 看答案明白了. 用的是two sum的思路. 比如最终找到一个区间,[i,j]满足sum = k,这个去见可以看做是 [0,j]的sum 减去 [0,i]的Sum. 维 ...

  6. [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 ...

  7. 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 ...

  8. 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 ...

  9. LeetCode Maximum Size Subarray Sum Equals k

    原题链接在这里:https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/ 题目: Given an array nums an ...

随机推荐

  1. 内涵段子——脑筋急转弯——spider

    # python 3.7 from urllib.request import Request,urlopen import re,time class Neihan(object): def __i ...

  2. Image Processing and Analysis_15_Image Registration: A Method for Registration of 3-D shapes——1992

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  3. Go语言——值方法 & 指针方法

    1 package main import ( "fmt" "sort" ) type SortableStrings []string type Sortab ...

  4. [Python] For 嵌套循环打印图形 nested loop - 练习题

    [python的for循环嵌套打印如下图形] 图形一: ******* ******* ******* ******* 图形二: * *** ***** ******* 图形三: * *** **** ...

  5. 用js刷剑指offer(二叉树的镜像)

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  6. CrawlSpider ---> 通用爬虫 项目流程

    通用爬虫 通用网络爬虫 从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果. 不扯 ...

  7. Flyme密码验证策略升级,忘记锁屏密码及「关机密码」功能

      手机里有很多需要用到密码的地方,比如「手机密码」.「文档锁定区」.「应用加密」.「隐私模式」.忘记密码可是一件麻烦事,以前只能通过清除数据或格式化存储盘来解决.现在有了「关联魅族账号」功能,这些功 ...

  8. mongodb的基本操作之数据写入和查询

    连接到mongodb服务器后,查看当前数据中有多少数据库 show dbs   切换数据库 use conf     删除数据库 db.dropDatabase() 再次使用 use conf 切换数 ...

  9. Nginx入门(一)——安装和配置

    1.下载地址 http://nginx.org/en/download.html 2.启动Nginx 进入window的cmd窗口,输入如下图所示的命令,进入到nginx目录(F:/nginx-1.8 ...

  10. [hdoj6415 Rikka with Nash Equilibrium][dp]

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...