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 ... 
随机推荐
- linux使用glibc版本安装mysql8.0.12
			1.前言 使用yum安装虽然很方便,但是如果要是在没有公网的环境下,是没有办法使用yum源的.所以我们可以使用mysql提供的glibc版本的安装包,进行安装. 但是在安装之前,一定要将以前的版本删除 ... 
- Spark学习笔记1——第一个Spark程序:单词数统计
			Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ... 
- selenium 模拟键盘事件 复制粘贴、右键、回车等
			#coding=utf-8 ''' selenium ''' from selenium import webdriver as wd import time bc=wd.Chrome(executa ... 
- spring实例化三:CglibSubclassingInstantiationStrategy
			在SimpleInstantiationStrategy类中,留下了包含MethodOverride对象的bd对象定义未做实现,做了抽象.CglibSubclassingInstanti ... 
- 属性 Attribute
			一.创建属性 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor, AllowMultiple = true, ... 
- Redis键值设计(转载)
			参考资料:https://blog.csdn.net/iloveyin/article/details/7105181 丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DB ... 
- 13、Spring Boot 2.x 多数据源配置
			1.13 Spring Boot 2.x 多数据源配置 完整源码: Spring-Boot-Demos 
- Codeforces Round #429 (Div. 2/Div. 1) [ A/_. Generous Kefa ] [ B/_. Godsend ] [ C/A. Leha and Function ] [ D/B. Leha and another game about graph ] [ E/C. On the Bench ] [ _/D. Destiny ]
			PROBLEM A/_ - Generous Kefa 题 OvO http://codeforces.com/contest/841/problem/A cf 841a 解 只要不存在某个字母,它的 ... 
- HDU 6150 - Vertex Cover   |  2017 中国大学生程序设计竞赛 - 网络选拔赛
			思路来自 ICPCCamp /* HDU 6150 - Vertex Cover [ 构造 ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 题意: 给了你一个贪心法找最小覆盖的算法,构造一组 ... 
- 005_FreeRTOS任务挂起和恢复
			(一) (二)使用,参数是任务句柄 //key任务函数 void key_task(void *pvParameters) { u8 key; ) { key=KEY_Scan(); switch(k ... 
