题目
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; }