最后更新

二刷

木有头绪啊。。

看答案明白了。

用的是two sum的思路。

比如最终找到一个区间,[i,j]满足sum = k,这个去见可以看做是

[0,j]的sum 减去 [0,i]的Sum.

维护一个map,来记录0-i的和,我们希望

0~i + k = 0 ~ j ,这样就可以更新一次i~j的区间长度作为候补的结果。

Time: O(n)

Space: O(n)

public class Solution {
public int maxSubArrayLen(int[] nums, int k) {
if (nums.length == 0) return 0;
Map<Integer,Integer> map = new HashMap<>(); int sum = 0;
int res = 0; for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sum == k) {
res = Math.max(res, i + 1);
} else if (map.containsKey(sum - k)) {
res = Math.max(res, i - map.get(sum - k));
} if (!map.containsKey(sum)) {
map.put(sum, i);
}
} return res; }
}

一刷

今晚各种卡。看提示是MAP,有了头绪。

先计算从0-0 0-1 0-2 0-3 0-4 0-n的值,累加就行,存入map,注意key是累加的值,value是0-index的indx。那么可能会有重复穿线的值,比如0-4 0-8的累加结果都是6,我们取最后的,一会解释。。

构建完MAP之后查MAP,看看有没有哪个值是target,有就更新一下结果= map.get(k) - 0,-0因为当前所有值都是从0开始累加的。

然后遍历数组。

看看1-1 1-2 1-3 1-5 .. 1-n有没有值等于target + nums[0],有就更新

再2-2 2-3 2-4 2-5 ... 2-n == target + nums[0] + nums[1]。。有就更新

解释一开始说的,为什么选后出现的INDEX作为value.

是因为我们倾向于选择晚出现的,因为如果1个值被查到,长度是返还的INDEX-当前的I,肯定是INDEX越大越符合我们要求,所以INDEX取晚出现的。

刚才讲过程的时候发现问题了。。好像没必要遍历两次,第二次查表的时候需要查的值越来越少,0-n 1-n 2-n,虽然查表都是O(1)不影响,但是似乎一遍就能下来。

假如结果是 1-5 减去1-3,在一开始建表的时候就可以计算,而且他的结果不会被后面的计算影响。 而6-8的结果只会从1-8 - 1-6得到,或者先从这个地方得到,不存在以后又遇到,就算以后又出现,肯定是1-8返还的index减去第一次出现的1-6得到的结果最大。。

好像可以,二刷再说。。先放个2 PASS的,反正都是O(N)

public class Solution
{
public int maxSubArrayLen(int[] nums, int k)
{
Map<Integer,Integer> map = new HashMap<Integer,Integer>(); int sum = 0;
for(int i = 0; i < nums.length;i++)
{
sum += nums[i];
map.put(sum,i);
} int res = 0;
if(map.containsKey(k))
res = map.get(k)+1; for(int i = 0; i < nums.length;i++)
{
if(map.containsKey(k+nums[i]))
res = Math.max(res,map.get(k+nums[i]) - i); k += nums[i];
} return res;
}
}

325. Maximum Size Subarray Sum Equals k的更多相关文章

  1. 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题是存储的当前累加和的 ...

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

  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. LeetCode 325. Maximum Size Subarray Sum Equals k

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

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

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

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

  9. Maximum Size Subarray Sum Equals k -- LeetCode

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

随机推荐

  1. 解决浮层弹出如何加上datepicker,并且浮动在上面

    最近在做一个弹出层上弹出的对话框中能弹出一个截止时间的选择框,这个选择框使用datepicker来做. 效果大致是这样的: 但是在做的时候,遇到一个问题,datepicker在弹出层的时候,时间选择框 ...

  2. Spring中的Resource

    Spring中的资源定义:Resource此接口的全名为:org.springframework.core.io.Resource比较常用的资源定义的实现类为:1.ClassPathResource ...

  3. org.apache.http.ProtocolException: Target host is not specified

    对于httpClient4.3访问指定页面,可以从下面的demo抽取方法使用. 注意:对于URL必须使用 http://开始,否则会有如下报错信息: Caused by: org.apache.htt ...

  4. Microsoft.Data.ConnectionUI.DataConnectionDialog

    MicrosoftVisualStudio里面的资源之数据库连接配置 这个功能的实现主要是用了Microsoft.Data.ConnectionUI.dll和Microsoft.Data.Connec ...

  5. mysqld -install命令时出现install/remove of the service denied错误的原因和解决办法

    原因:没有使用管理员权限 解决方法:使用管理员权限打开cmd,然后运行mysqld -install,服务安装成功

  6. POJ3352Road Construction(无向图强连通)

    http://poj.org/problem?id=3352 无向图强连通分量缩点 知道一个等式: 若要使得任意一棵树,在增加若干条边后,变成一个双连通图,那么 至少增加的边数 =( 这棵树总度数为1 ...

  7. Innodb 锁系列2 事务锁

    上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...

  8. JSOI2008 最小生成树计数

    题解: 最小生成树的两个性质: 1.边权相等的边的个数一定. 2.做完边权为w的所有边时,图的连通性相同. 证明: 1.边权相等的边的个数不一样的话就不会都同时是最小生成树了. 2.假设每种方法的做完 ...

  9. 修改Android默认背光值

    /********************************************************************* * 修改Android默认背光值 * 说明: * 本文主要 ...

  10. 【原创】batch-GD, SGD, Mini-batch-GD, Stochastic GD, Online-GD -- 大数据背景下的梯度训练算法

    机器学习中梯度下降(Gradient Descent, GD)算法只需要计算损失函数的一阶导数,计算代价小,非常适合训练数据非常大的应用. 梯度下降法的物理意义很好理解,就是沿着当前点的梯度方向进行线 ...