lc2963 统计好分割方案的数目

给定正整数数组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;
    }
};
posted @ 2024-03-21 22:37  chenfy27  阅读(4)  评论(0编辑  收藏  举报