配列numsとターゲット値kが与えられた場合、合計がkに等しい最長のサブ配列の長さを見つけます。要件を満たすサブ配列がない場合は、0が返されます。
注:
nums配列の合計は、32ビットの符号付き整数の範囲内である必要があります。
例1:
入力:nums = [1、-1、5、-2、3]、k = 3
出力:4
説明:サブ配列[1、-1、5、-2]の合計は3に等しく、長さが最長です。
例2:
入力:nums = [-2、-1、2、1]、k = 1
出力:2
説明:サブ配列[-1、2]の合計は1に等しく、長さが最長です。
出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/maximum-size-subarray-sum-equals-k
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
public class 和为k的最长子数组的长度leetcode325 {
public static int maxSubArrayLen(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>(); // map在这里存储sum和对应的下标值
map.put(0, -1); // 这里初始化为-1,假设0,j的和为k,那么我们得到的长度就是 j-(-1)
int sum = 0;
int len = 0;
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
int preSum = sum - k;
if (map.containsKey(preSum)) {
len = Math.max(len, j - map.get(preSum));
}
if (!map.containsKey(sum)) {
map.put(sum, j);
}
}
return len;
}
public static void main(String[] args) {
// System.out.println(maxSubArrayLen(new int[]{-2,-1,2,1}, 1));
System.out.println(maxSubArrayLen(new int[]{
1, -1, 5, -2, 3}, 3));
}
}