1. 程式人生 > 實用技巧 >5471. 和為目標值的最大數目不重疊非空子陣列數目 字首和

5471. 和為目標值的最大數目不重疊非空子陣列數目 字首和

給你一個數組 nums 和一個整數 target 。

請你返回 非空不重疊 子陣列的最大數目,且每個子陣列中數字和都為 target 。

示例 1:

輸入:nums = [1,1,1,1,1], target = 2
輸出:2
解釋:總共有 2 個不重疊子陣列(加粗數字表示) [1,1,1,1,1] ,它們的和為目標值 2 。
示例 2:

輸入:nums = [-1,3,5,1,4,2,-9], target = 6
輸出:2
解釋:總共有 3 個子陣列和為 6 。
([5,1], [4,2], [3,5,1,4,2,-9]) 但只有前 2 個是不重疊的。
示例 3:

輸入:nums = [-2,6,6,3,5,4,1,2,8], target = 10
輸出:3
示例 4:

輸入:nums = [0,0,0], target = 0
輸出:3

提示:

1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
0 <= target <= 10^6

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/maximum-number-of-non-overlapping-subarrays-with-sum-equals-target
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

用sum記錄當前的字首和,用set存放各個位置的字首和。
在記錄的過程中,對於當前的sum,若set中存在 sum - target 的值,這就代表找到一個子陣列。
為了防止重疊,即之前所有的字首和都不用了,直接把set清空。

class Solution {
public:
    int maxNonOverlapping(vector<int>& nums, int target) {
        set <int> s;

        int ans = 0, sum = 0;

        s.insert(0);
        for (auto num : nums) {
            sum += num;
            if (s.find(sum - target) != s.end()) {
                s.clear();
                sum = 0;
                ans++;
            }
            s.insert(sum);
        }

        return ans;
    }
};