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?
Idea 1. HashMap to store (prefixSum, the first index prefixSum ends) + prefix subarray sum.
Time complexity: O(n)
Space complexity: O(n)
1 public class Solution { 2 public int maxSubArrayLen(int[] nums, int k) { 3 int maxLen = 0; 4 Map<Integer, Integer> sumIndex = new HashMap<>(); 5 sumIndex.put(0, -1); 6 7 int sum = 0; 8 for(int i = 0; i < nums.length; ++i) { 9 sum += nums[i]; 10 Integer left = sumIndex.get(sum - k); 11 if(left != null) { 12 maxLen = Math.max(maxLen, i - left); 13 } 14 sumIndex.putIfAbsent(sum, i); 15 } 16 return maxLen; 17 } 18 }
原文地址:https://www.cnblogs.com/taste-it-own-it-love-it/p/10425222.html
时间: 2024-10-25 22:19:21