uacs2024

导航

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

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;
    }
};

 

posted on 2024-12-03 21:28  ᶜʸᵃⁿ  阅读(17)  评论(0)    收藏  举报