给定正整数数组nums[n],将数组分割成1个或多个连续子数组,如果不存在包含了相同数字的两个子数组,则认为是一种好分割方案,求好分割方案的数目,结果对1000000007取模。
1<=n<=1e5; 1<=nums[i]<=1e9
相同的数字只能分到同一个子数组,转化成区间合并问题。然后枚举每个可以分割的位置,选或不选,有两种方案,所有位置相乘即为结果。
class Solution {
public:
int numberOfGoodPartitions(vector<int>& nums) {
map<int,vector<int>> mp;
int n = nums.size();
for (int i = 0; i < n; i++) {
auto it = mp.find(nums[i]);
if (it == mp.end()) {
mp[nums[i]].push_back(i);
} else {
vector<int> &v = it->second;
if (v.size() == 1) {
v.push_back(i);
} else {
v.back() = i;
}
}
}
vector<pair<int,int>> vp;
for (auto &[k,v]:mp) {
if (v.size() > 1) {
vp.push_back({v[0], v[1]});
}
}
sort(vp.begin(), vp.end());
int L = -1, R = 0, cnt = 0;
for (auto [x,y] : vp) {
if (L == -1) {
L = x; R = y;
} else {
if (x <= R) {
R = max(R, y);
} else {
cnt += R-L;
L = x; R = y;
}
}
}
if (L != -1) {
cnt += R-L;
}
int ans = 1;
for (int i = 1; i < n-cnt; i++) {
ans *= 2;
ans %= 1000000007;
}
return ans;
}
};
标签:分割,lc2963,nums,int,back,vp,mp,数目
From: https://www.cnblogs.com/chenfy27/p/18088412