和为K的最长子数组

1. LeetCode 325: Maximum size subarray sum equals k

https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/description/

2. 描述:

给定一个整数数组和一个目标值k,找出和为k的最长子数组的长度,如果不存在的话就返回0。

3. 示例 1:

给定 nums = [1, -1, 5, -2, 3], k = 3

返回4, 因为子数组[1, -1, 5, -2]的和等于3,并且是最长的子数组

示例 2:

给定 nums = [-2, -1, 2, 1], k = 3

返回2,因为子数组[2, 1]的和等于3,而且是最长的子数组

4. 解决方案

int maxSubArrayLen(vector<int>& nums, int k){
    unordered_map<int,int> sums;
    int max_len = 0;
    int sum = 0;
    for(int i = 0; i < nums.size(); i++){
        sum += nums[i];
        if(sum == k){
            max_len = i + 1;
        }else if(sums.count(sum - k)){
            max_len = max(max_len, i - sums[nums[i] - k]);
        }
        if(!sums.count(sum){
            sums[nums[i]] = i;
        }
    }
    return max_len;
}

5. 思路:

sums保存的值为<cur_sum, index>, 即当前数之和以及当前的索引值,所以如果当前的和等于k,那么就说明前i个数的和为k ,即max length = i + 1;

如果前i个数的和为sum_i, 前j个数的和为sum_j, 并且 sum_i + 8 = sum_j, 那么sum_i = sum_j - 8, 即对于前i个数的和sum_i来说,如果已经存在前j个数的和sum_j = sum_i - 8, 那么i - j 就是所求的max length。

Table of Contents