哈希(4)

原题:

/**
 * Created by gouthamvidyapradhan on 18/10/2017.
 * 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.

 Note:
 The sum of the entire nums array is guaranteed to fit within the 32-bit signed integer range.

 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?
 */

解析:求最大的子数组,它的和等于给定的值

答案:


public class MaximumSizeSubarraySumEqualsk {

    /**
     * Main method
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception{
              int[] A = {2,-1,5,-2,3,0};
            System.out.println(maxSubArrayLen(A, 6));
    }

    public int maxSubArrayLen(int[] nums, int k) {
        Map<Integer, Integer> index = new HashMap<>();
        int sum = 0;
        for(int i = 0; i < nums.length; i ++){
            sum += nums[i];
            index.putIfAbsent(sum, i);
        }
        sum = 0;
        int ans = 0;
        for(int i = 0; i < nums.length; i ++){
            sum += nums[i];
            if(sum == k){
                ans = Math.max(ans, i + 1);
            } else{
                int exp = sum - k;
                if(index.containsKey(exp)){//如果当前的和减去预定值index里有包含
                    int farLeft = index.get(exp);//把这个值的下标拿过来和当前下标进行比较
                    if(farLeft < i){
                        ans = Math.max(ans, i - index.get(exp));
                    }
                }
            }
        }
        return ans;
    }

}

核心思路:

  1. 把所有和和下标存在map里
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值