题目
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?解法一:递归 O(n^2)
public int maxSubArrayLen1(int[] nums, int k) {
if(nums.length==0) return 0;
int sum = 0;
for(int i:nums){
sum+=i;
}
return helper(nums,k,0,nums.length-1,sum);
}
public int helper(int[] nums, int k, int b, int e,int sum) {
System.out.println("b="+b+", e="+e);
if(sum==k) return e-b+1;
if(b>=e) return 0;
return Math.max(helper(nums,k,b+1,e,sum-nums[b]), helper(nums,k,b,e-1,sum-nums[e]));
}
解法二:HashMap O(n)
public int maxSubArrayLen(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
int sum=0, maxL = 0;
map.put(0,-1);
for(int i=0; i<nums.length; i++){
sum+=nums[i];
if(map.containsKey(sum-k)){
maxL = Math.max(maxL, i-map.get(sum-k));
}
if(!map.containsKey(sum)) map.put(sum,i);
}
return maxL;
}