5471. 和為目標值的最大數目不重疊非空子陣列數目 字首和
阿新 • • 發佈:2020-08-09
給你一個數組 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; } };