leetcode 1695. 删除子数组的最大得分。使用bitset当作标记,时间内存的表现都极佳。
法一:使用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;
}
};