首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【快排算法】颜色分类 / 排序数组 / 数组中的第K个最大元素 / LCR 库存管理 III

【快排算法】颜色分类 / 排序数组 / 数组中的第K个最大元素 / LCR 库存管理 III

作者头像
_小羊_
发布2025-04-09 08:39:23
发布2025-04-09 08:39:23
1550
举报
文章被收录于专栏:C++C++

快速选择算法是用于在无序数组中寻找第 k 小(或第 k 大)元素的高效算法 ,是快速排序算法的一个变种。

颜色分类

代码语言:javascript
复制
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int i = 0, l = -1, r = nums.size();
        while (i < r)
        {
            if (nums[i] == 0) swap(nums[++l], nums[i++]);
            else if (nums[i] == 1) i++;
            else swap(nums[--r], nums[i]);
        }
    }
};

排序数组

代码语言:javascript
复制
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand(time(nullptr));
        qsort(nums, 0, nums.size() - 1);
        return nums;
    }
    void qsort(vector<int>& nums, int l, int r)
    {
        if (l >= r) return;
        int key = nums[rand() % (r - l + 1) + l]; // 获取随机基准值
        int i = l, left = l - 1, right = r + 1;
        // 三路划分
        while (i < right)
        {
            if (nums[i] < key) swap(nums[++left], nums[i++]);
            else if (nums[i] == key) i++;
            else swap(nums[--right], nums[i]);
        }
        qsort(nums, l, left);
        qsort(nums, right, r);
    }
};

数组中的第K个最大元素

最容易想到的就是优先级队列。

代码语言:javascript
复制
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> pq;
        for (auto e : nums) pq.push(e);
        int ret = 0;
        while (k--)
        {
            ret = pq.top();
            pq.pop();
        }
        return ret;
    }
};

快速选择算法

经常出错:else return qsort(arr, l, left, k - b - c);

代码语言:javascript
复制
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(nullptr));
        return qsort(nums, 0, nums.size() - 1, k);
    }
    int qsort(vector<int>& arr, int l, int r, int k)
    {
        if (l >= r) return arr[l];
        int key = arr[rand() % (r - l + 1) + l]; // 随机基准值
        int i = l, left = l - 1, right = r + 1;
        // 三路划分
        while (i < right)
        {
            if (arr[i] < key) swap(arr[++left], arr[i++]);
            else if (arr[i] == key) i++;
            else swap(arr[--right], arr[i]);
        }
        // 分情况讨论
        int c = r - right + 1, b = right - left - 1;
        if (c >= k) return qsort(arr, right, r, k);
        else if (c + b >= k) return key;
        else return qsort(arr, l, left, k - b - c);
    }
};

LCR 159. 库存管理 III

最先想到的还是优先级队列。

代码语言:javascript
复制
class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
        priority_queue<int, vector<int>, greater<int>> pq;
        for (auto e : stock) pq.push(e);
        vector<int> ret;
        while (cnt--)
        {
            ret.push_back(pq.top());
            pq.pop();
        }
        return ret;
    }
};

快速选择算法。

我就说经常出错吧,这才几分钟…else qsort(stock, right, r, cnt - a - b);

代码语言:javascript
复制
class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
        srand(time(nullptr));
        qsort(stock, 0, stock.size() - 1, cnt);
        return { stock.begin(), stock.begin() + cnt };
    }
    void qsort(vector<int>& stock, int l, int r, int cnt)
    {
        if (l >= r) return;
        int key = stock[rand() % (r - l + 1) + l];
        int i = l, left = l - 1, right = r + 1;
        while (i < right)
        {
            if (stock[i] < key) swap(stock[++left], stock[i++]);
            else if (stock[i] == key) i++;
            else swap(stock[--right], stock[i]);
        }
        int a = left - l + 1, b = right - left - 1;
        if (a >= cnt) qsort(stock, l, left, cnt);
        else if (a + b >= cnt) return;
        else qsort(stock, right, r, cnt - a - b);
    }
};

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 颜色分类
  • 排序数组
  • 数组中的第K个最大元素
  • LCR 159. 库存管理 III
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档