• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: Maximum Size Subarray Sum Equals k

Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn't one, return 0 instead.

Example 1:
Given nums = [1, -1, 5, -2, 3], k = 3,
return 4. (because the subarray [1, -1, 5, -2] sums to 3 and is the longest)

Example 2:
Given nums = [-2, -1, 2, 1], k = 1,
return 2. (because the subarray [-1, 2] sums to 1 and is the longest)

Follow Up:
Can you do it in O(n) time?

Like the other subarray sum problems Lintcode: Subarray Sum closest

Use a HashMap to keep track of the sum from index 0 to index i, use it as the key, and use the current index as the value

build the hashmap: scan from left to write, if the current sum does not exist in the hashmap, put it in. If the current sum does exist in Hashmap, do not replace or add to the older value, simply do not update. Because this value might be the left index of our subarray in later comparison. We are looking for the longest subarray so we want the left index to be the smaller the better. 

Every time we read a number in the array, we check to see if map.containsKey(num-k), if yes, try to update the maxLen.

 1 public class Solution {
 2     public int maxSubArrayLen(int[] nums, int k) {
 3         if (nums==null || nums.length==0) return 0;
 4         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 5         map.put(0, -1);
 6         int sum = 0;
 7         int maxLen = Integer.MIN_VALUE;
 8         for (int i=0; i<nums.length; i++) {
 9             sum += nums[i];
10             if (!map.containsKey(sum)) {
11                 map.put(sum, i);
12             }
13             if (map.containsKey(sum-k)) {
14                 int index = map.get(sum-k);
15                 maxLen = Math.max(maxLen, i-index);
16             }
17         }
18         return maxLen==Integer.MIN_VALUE? 0 : maxLen;
19     }
20 }

 

posted @ 2016-01-06 04:20  neverlandly  阅读(7425)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3