给定一个数组 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)
链接:https://leetcode-cn.com/problems/maximum-size-subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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));
}
// 当有相同的sum时,以小的index为准,因为要求子数组的最大长度
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));
}
}