leetcode 5471 和为目标值的最大数目不重叠非空子数组

2020-08-09  本文已影响0人  ColdRomantic

5471. 和为目标值的最大数目不重叠非空子数组数目

给你一个数组 nums 和一个整数 target 。
请你返回 非空不重叠 子数组的最大数目,且每个子数组中数字和都为 target 。

示例 1:
输入:nums = [1,1,1,1,1], target = 2
输出:2
解释:总共有 2 个不重叠子数组(加粗数字表示) [1,1,1,1,1] ,它们的和为目标值 2 。

关键点:子数组 (即连续的一个区间)
思路: 前缀和 + 贪心

如果能在找到满足 sum - target 的值,那么便找到一个子数组。并且为了防止重叠,前面的和全部不能再用了,直接把set清空。
(这里利用的是贪心的思想,找到一个算一个)

class Solution {
public:
    int maxNonOverlapping(vector<int>& nums, int target) {
        int ans = 0;
        int sumB = 0;
        // 记录之前的前缀和 <前缀和,下标>
        unordered_set<int> s;
        s.insert(0);
        for(int i = 0; i < nums.size(); i++){
            sumB += nums[i];
            //之前的前缀和恰好有一个匹配
            if(s.find(sumB - target) != s.end()){
               ++ans;
               // 那么之前的前缀和都丢弃
               s.clear();
               // s.insert(0);
               sumB = 0;
            }
            s.insert(sumB);
        }
        return ans;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读