uacs2024

导航

leetcode 1695. 删除子数组的最大得分。使用bitset当作标记,时间内存的表现都极佳。

1695. 删除子数组的最大得分

法一:使用set 或者 unordered_set

class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        int size = nums.size(),resMax = 0,nowSum = 0,left = 0,right;
        unordered_set<int> numAdded;//232ms,127.96MB
        //set<int> numAdded;//391ms,156.74MB,表现更差
        for(right = 0;right < size;++right){
            if(numAdded.contains(nums[right])){
                resMax = max(resMax,nowSum);
                while(numAdded.contains(nums[right])){
                    nowSum -= nums[left];
                    numAdded.erase(nums[left]);
                    ++left;
                }
            }
                numAdded.insert(nums[right]);
                nowSum += nums[right];
        }
        
        return max(resMax,nowSum);
    }
};

法二:使用bitset 给添加过的nums[i] 作为 标记。用时3ms,击败96.98%;内存90.89MB,击败92.95%

class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        //bitset在bitset头文件中,每一个元素只能是0或1,每个元素只用1bit空间
        bitset<10001> bs; //长度为10001,默认每一位为0 , 1 ≤ nums[i] ≤ 10^4
        int left = 0, right = 0, res = 0, sum = 0, size = nums.size();
        while (right < size) {
            while (bs.test(nums[right])) {//判断bs在第right位 是否为1,是则返回true
                sum -= nums[left];
                bs.reset(nums[left]);//把bs中 left 位置置为0。也就是说通过left将nums[right]加入时是没有重复的
                ++left;
            }
            sum += nums[right];
            bs.set(nums[right]);//把bs中第right位 置为1
            res = max(res, sum);
            ++right;
        }
        return res;
    }
};

 

posted on 2024-12-09 20:17  ᶜʸᵃⁿ  阅读(9)  评论(0)    收藏  举报