Given an array nums
and an integer target
.
Return the maximum number of non-empty non-overlapping subarrays such that the sum of values in each subarray is equal to target
.
Example 1:
Input: nums = [1,1,1,1,1], target = 2
Output: 2
Explanation: There are 2 non-overlapping subarrays [1,1,1,1,1] with sum equals to target(2).
Example 2:
Input: nums = [-1,3,5,1,4,2,-9], target = 6
Output: 2
Explanation: There are 3 subarrays with sum equal to 6.
([5,1], [4,2], [3,5,1,4,2,-9]) but only the first 2 are non-overlapping.
思路:greedy,就是每次找到一个区间了之后,就把之前的prefixsum 抹掉,因为不需要了,题目要求不overlap,那么重新开始即可;
class Solution {
public int maxNonOverlapping(int[] nums, int target) {
int sum = 0;
int count = 0;
HashSet<Integer> set = new HashSet<>();
for(int num: nums) {
// sum 表示当前累计的前缀和
// set 储存之前的前缀和
sum += num;
// 若 sum 直接等于 target 或者之前的前缀和中存在 sum - target
// 说明找到了一个子数组 (这个子数组以 num 结尾)
// 然后 res++, 并清空 set 和 sum 继续寻找下一个子数组
// 否则, 将 sum 添加到 set 中, 继续寻找
if(set.contains(sum - target) || sum == target) {
count++;
set.clear(); // 这里用到了greedy的思想,就是我找到了一个,那么清空,前面的不考虑了;
sum = 0;
} else {
set.add(sum);
}
}
return count;
}
}