贪心思想来源于leetcode 435
前后缀+哈希来源于 leetcode 560
本文使用的是后缀
class Solution {
public:
int maxNonOverlapping(vector<int>& nums, int target) {
int n=nums.size();
int suffix=0;
map<int,int>mp;
int end=n;// 记录每个区间的起点,因为是使用的后缀和,因此倒着遍历相当于以区间终点贪心
mp[0]=n;
int res=0;
for(int i=n-1;i>=0;i--){
suffix+=nums[i];
if(mp.find(suffix-target)!=mp.end()){
if(mp[suffix-target]-1<end){
end=i;
// cout<<end<<endl;
res+=1;
}
}
mp[suffix]=i;
}
return res;
}
};
以此为例分析2,-1,4,2,1,-1 target=6
class Solution {
public:
int maxNonOverlapping(vector<int>& nums, int target) {
int n=nums.size();
int suffix=0;
set<int>s;
s.insert(0);
int res=0;
for(int i=n-1;i>=0;i--){
suffix+=nums[i];
if(s.find(suffix-target)!=s.end()){
res+=1;
s.clear();
suffix=0;
}
// s.insert(0);
s.insert(suffix);
}
return res;
}
};