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:
Input: nums =[1, -1, 5, -2, 3]
, k =3
Output: 4 Explanation: The subarray[1, -1, 5, -2]
sums to 3 and is the longest.
Example 2:
Input: nums =[-2, -1, 2, 1]
, k =1
Output: 2 Explanation: The subarray[-1, 2]
sums to 1 and is the longest.
Follow Up:
Can you do it in O(n) time?
思路:prefixsum,这里可以不用array存,直接sum加起来,用hashmap就变成了<Integer, Integer> sum, index
只要查sum - target 是否存在就可以,存在就是当前index - i,0...i ...j 长度就是j - i; O(N)
class Solution {
public int maxSubArrayLen(int[] nums, int k) {
if(nums == null || nums.length == 0) {
return 0;
}
int res = 0;
int cursum = 0;
// cursum 0 based index
HashMap<Integer, Integer> hashmap = new HashMap<>();
hashmap.put(0, -1); // 是为了array刚好 0...j 元素和是target,那么长度是j - (-1) = j + 1用的;
for(int i = 0; i < nums.length; i++) {
cursum += nums[i];
if(hashmap.containsKey(cursum - k)) {
res = Math.max(res, i - hashmap.get(cursum - k));
}
// 这行很关键,就是之前有,就不要存,因为是找最大的length,所以前面的不要覆盖掉;
if(!hashmap.containsKey(cursum)) {
hashmap.put(cursum, i);
}
}
return res;
}
}