[LeetCode力扣hot100]-快速选择和快排

news/2025/2/24 14:14:36

快速选择与快速排序的区别:

  • 快速排序:递归地对数组的左右两部分进行排序。
  • 快速选择:只递归处理包含第 k 个元素的那一部分,目标是找到第 k 大的元素,而不是对整个数组排序。

快排

void quickSortHelper(vector<int>& nums, int left, int right) {
        if (left >= right) return;  // 如果子数组的长度小于或等于 1,已经排序

        // 划分操作
        int pivotIndex = partition(nums, left, right);

        // 递归对左右两部分进行排序
        quickSortHelper(nums, left, pivotIndex - 1);
        quickSortHelper(nums, pivotIndex + 1, right);
    }

    int partition(vector<int>& nums, int left, int right) {
        // 选择 pivot(本例选择最右边的元素作为 pivot)
        int pivot = nums[right];
        int i = left - 1;

        // 遍历数组,调整小于和大于 pivot 的元素的位置
        for (int j = left; j < right; ++j) {
            if (nums[j] <= pivot) {
                // 将小于或等于 pivot 的元素放到数组的左边
                swap(nums[++i], nums[j]);
            }
        }

        // 将 pivot 放到它最终应该在的位置
        swap(nums[i + 1], nums[right]);
        return i + 1;  // 返回 pivot 的最终位置
    }

1.数组中第k大的数-快速选择

https://leetcode.cn/problems/kth-largest-element-in-an-array/description/?envType=study-plan-v2&envId=top-100-liked腾讯面经高频真题,这题看上去不难,但是难点是复杂度规定为O(n)

如果用sort的话 就是O(nlogn)能做出来不太合规就是

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());

        return nums[int(nums.size())-k];
    }
};

想要得到O(n),就要用快速选择算法,但是只能收敛于O(n)。 

思想

  • 选取基准元素:像快速排序一样,从数组中选择一个基准元素。
  • 分区:将数组分成两部分,一部分小于基准,一部分大于基准。
  • 判断基准位置
    • 如果基准的位置刚好是 k,则返回该元素。
    • 如果 k 小于基准位置,递归地在左半部分查找。
    • 如果 k 大于基准位置,递归地在右半部分查找。
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(NULL));  // 初始化随机数生成器
        return quickSelect(nums, 0, nums.size() - 1, k - 1);  // 调用快速选择函数
    }

private:
    int quickSelect(vector<int>& nums, int left, int right, int k) {
        // 选择中点作为 pivot
        int pivot = nums[left + (right - left) / 2];
        int i = left, j = right;
        
        // 双指针划分
        while (i <= j) {
            while (nums[i] > pivot) i++;  // 找到左边小于 pivot 的元素
            while (nums[j] < pivot) j--;  // 找到右边大于 pivot 的元素
            if (i <= j) {
                swap(nums[i], nums[j]);  // 交换
                i++;
                j--;
            }
        }
        
        // 根据 k 的位置决定继续在左半边还是右半边递归
        if (left <= k && k <= j) return quickSelect(nums, left, j, k);  // 左边部分
        if (i <= k && k <= right) return quickSelect(nums, i, right, k);  // 右边部分
        
        return nums[k];  // 找到 k 位置的元素
    }
};

2.统计字符串含有大写字母A的个数


http://www.niftyadmin.cn/n/5864445.html

相关文章

MongoDB#常用语句

创建TTL索引(自动删除过期数据) db.xxx_collection.createIndex({ createTime: 1 }, { expireAfterSeconds: 1 * 24 * 60 * 60 * 1000 }); 查询JavaScript函数(mongosh) db.system.js.find 查询document条数 db.getCollection(‘xxx’).countDocuments({}) 根据_id查询 {‘_id’…

07.Docker 数据管理

Docker 数据管理 Docker 数据管理1. 数据卷(data volume)2. 数据卷容器 Docker 数据管理 Docker 镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件&#…

CentOS-7-x86_64-Minimal-2009 免费下载与使用教程

一、CentOS-7-x86_64-Minimal-2009 简介 CentOS 7 是一款基于 Red Hat Enterprise Linux (RHEL) 的开源操作系统&#xff0c;Minimal 版本 仅包含基础软件包&#xff0c;适合需要轻量化、高定制的服务器或开发环境。 核心优势&#xff1a; 轻量高效&#xff1a;仅需约 900MB 存…

机器学习数学通关指南——泰勒公式

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 泰勒公式是用多…

进程的替换

目录 execl execv execlp execvpe ​编辑 再认识环境变量&#xff1a; 进程的替换不是创建新进程&#xff0c;用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进…

遗传算法初探

组成要素 编码 分为二进制编码、实数编码和顺序编码 初始种群的产生 分为随机方法、基于反向学习优化的种群产生。 基于反向学习优化的种群其思想是先随机生成一个种群P(N)&#xff0c;然后按照反向学习方法生成新的种群OP(N),合并两个种群&#xff0c;得到一个新的种群S(N…

NebulaAI - 企业级 AI Agent 构建平台

NebulaAI 是什么 行云创新的 NebulaAI 是一款专为企业打造的 AI 应用开发平台&#xff0c;旨在通过自然语言交互和云原生技术&#xff0c;帮助企业实现智能化转型。 NebulaAI 核心功能 NebulaAI 的核心功能包括&#xff1a; 自然语言交互&#xff1a;用户可以通过语音或文本…

Ollama API 交互

Ollama 提供了基于 HTTP 的 API&#xff0c;允许开发者通过编程方式与模型进行交互。 本文将详细介绍 Ollama API 的详细使用方法&#xff0c;包括请求格式、响应格式以及示例代码。 1. 启动 Ollama 服务 在使用 API 之前&#xff0c;需要确保 Ollama 服务正在运行。可以通过…