Maximum Number of Non-Overlapping Subarrays With Sum Equals Target

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值