leetcode 2653. 滑动子数组的美丽值


暴力超时解,纯批判性展示🤡
class Solution {
public:
vector<int> getSubarrayBeauty(vector<int>& nums, int k, int x) {
int size = nums.size();
if(size == k){
sort(nums.begin(),nums.end());
if(nums[x-1] < 0) return {nums[x-1]};
else return {0};
}
vector<int> res;
multiset<int> numAdded;
for(int i = 0;i < k;i++){
numAdded.insert(nums[i]);
}
for(int i = 0;i < size - k + 1;i++){
auto it = numAdded.begin();
advance(it, x-1);//将指针从开头往后移动x-1位
if(*(it) < 0) res.emplace_back(*(it));
else res.emplace_back(0);
numAdded.extract(nums[i]);//只删掉一个nums[i]
if(i + k <= size-1) numAdded.insert(nums[i+k]);
}
return res;
}
};
法一:使用map,用时击败18.28%,消耗内存击败10.08%😅
class Solution {
public:
vector<int> getSubarrayBeauty(vector<int>& nums, int k, int x) {
int size = nums.size();
vector<int> res;
map<int,int> numAdded;
for(int i = 0;i < k;i++){
numAdded[nums[i]]++;
}
for(int i = 0;i < size - k + 1;i++){
int now = 0;
for (auto it = numAdded.begin(); it != numAdded.end(); it++) {
now += it->second;
if(now >= x){
if(it -> first < 0) res.emplace_back(it -> first);
else res.emplace_back(0);
break;
}
}
if(numAdded[nums[i]] == 1) numAdded.erase(nums[i]);
else numAdded[nums[i]]--;
if(i + k <= size-1) numAdded[nums[i+k]]++;
}
return res;
}
};
法二:计数排序,不需STL
class Solution {
public:
vector<int> getSubarrayBeauty(vector<int>& nums, int k, int x) {
int size = nums.size();
const int BIAS = 50;
int numAdded[BIAS * 2 + 1]{}; //{}的作用是将数组所有元素初始化为默认值
vector<int> res(size - k + 1);//直接初始化所有元素为0
for(int i = 0;i < k - 1;i++){
numAdded[nums[i] + BIAS]++;
}
for(int i = k - 1;i < size;i++){
numAdded[nums[i] + BIAS]++;
int now = 0;
for(int j = 0;j < BIAS;j++){
//暴力枚举负数范围[-50,-1],如果要找到j >= 50,说明就算找到也是赋值为0,所以干脆j < 50就停止
now += numAdded[j];
if(now >= x){
res[i - k + 1] = j - BIAS;break;
}
}
numAdded[nums[i - k + 1] + BIAS]--;
}
return res;
}
};
浙公网安备 33010602011771号