215. Kth Largest Element in an Array(找出第K大的数)

在整数数组中寻找第K大的数 题目描述:在一个整数数组中,根据快排的思路,找出数组中第K大的数 思路: 利用快排思想,例如在49个元素中找第24大的元素, 首先,进行一次快排,(将大的放到前半段,晓得放到后半段),假设得到的中轴为p 判断p-low+1 == k,如果成立,直接输出a[p],(因为前半段有k-1个大于a[p]的元素,故a[p]为第k大的元素) 如果p-low+1 > k,则第k大的元素在前半段,... 阅读详情

既然是要找到第K大的数,那么自然想到先排好序再输出。于是写了一个快速排序算法:

void mySort(vector<int>& vec, int left, int right) {
    int i = left, j = right;
    int mid = vec[(left + right) / 2];
    while (i <= j) {
        while (vec[i] < mid)
            i++;
        while (vec[j] > mid)
            j--;
        if (i <= j) {
            int tmp = vec[i];
            vec[i] = vec[j];
            vec[j] = tmp;
            i++;
            j--;
        }
    }
    if (left < j)
        mySort(vec, left, j);
    if (i < right)
        mySort(vec, i, right);
}

class Solution {
public:
	int findKthLargest(vector<int>& nums, int k) {
		int len = nums.size();
        mySort(nums, 0, len - 1);
        return nums[len - k];
	}
};

虽然很快就AC了,但是毕竟在学分治算法,想尝试一下用分治怎么用。于是上网找了此题的分治做法,主要是通过pivot来重构数组,想法很妙:寻找第K大的数,即寻找降序数组中位于第K位置的值。要重构数组,先找一个数当成pivot,比它大的放在数组左边,比它小的放在数组右边,不断重复直到pivot位于数组的第K个位置。

void swap(vector<int>& vec, int i, int j) {
    int tmp = vec[j];
    vec[j] = vec[i];
    vec[i] = tmp;
}

int partition(vector<int>& vec, int left, int right) {
    int pivot = vec[left];
    int i = left + 1, j = right;
    while (i <= j) {
        if (vec[i] < pivot && vec[j] > pivot) {
            swap(vec, i, j);
            i++;
            j--;
        }
        if (vec[i] >= pivot)
            i++;
        if (vec[j] <= pivot)
            j--;
    }
    swap(vec, left, j);
    return j;
}

class Solution {
public:
	int findKthLargest(vector<int>& nums, int k) {
        int len = nums.size();
        int l = 0, r = len - 1;
		while (1) {
            int pos = partition(nums, l, r);
            if (pos == k - 1)
                return nums[pos];
            else if (pos > k - 1)
                r = pos - 1;
            else if (pos < k - 1)
                l = pos + 1;
        }
	}
};


其实用map来解这道题也是很方便的,算法思想有点类似桶排序,将数组元素当作键,元素出现的次数当作值,保存起来,最后输出第n-k+1小的数(即第k大的数):

class Solution {
public:
	int findKthLargest(vector<int>& nums, int k) {
        map<int, int> m;
        int len = nums.size();
        for (int j = 0; j < len; j++) {
            m[nums[j]]++;
        }
        map<int, int>::iterator it = m.begin();
        k = len - k + 1;
        while (k > (it->second)) {
            k = k - (it->second);
            it++;
        }
        return it->first;
	}
};

除此之外,C++也有许多自带排序的数据结构,例如set、priority_queue,虽然对做算法题没有什么作用,但是可以作为一个实用的数据结构供我们今后使用。

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        multiset<int> q(nums.begin(), nums.end());
        multiset<int>::iterator it;
        int flag = 1;
        int len = nums.size();
        for (it = q.begin(); it != q.end(); it++, flag++) {
            if (flag == len - k + 1)
                break;
        }
        return *it;
    }
};
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> q(nums.begin(), nums.end());
        for (int i = 0; i < k - 1; ++i) {
            q.pop();
        }
        return q.top();
    }
};

数组第K小的数 1.1 题目描述 查找一个数组的第K小的数,注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数为3。 输入描述: 输入有多组数据。 每组输入n,然后输入n个整数(1<=n<=1000),再输入k。输出描述: 输出第k小的整数。输入例子: 6 2 1 3 5 2 2 3输出例子: 3方案1:对数组进行排序,然后找出第k小的数字 时间复杂度O(nlogn), 空间复杂度O 阅读详情

相关推荐

【crawler笔记】R语言简单动态网页爬虫(rvest包)示例

1、爬虫目标 大家普遍认为Python的爬虫功能强大,但在解决动态加载或者登陆网站时,Python存在一定困难的,相对于一些普通爬虫,使用R语言会更方便。 以https://www.thepaper.cn/为例,爬取首页的新闻(标题、内容、时间),主要采用的是动态网页中常用的httr包。 初始学习时,参考了B站《20分钟入门基于R语言的网络爬虫_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili》的视频,但代码运行出现了报错,所以在原代码上做了修改。 2、代码分析及报错修改 library(rv

seeyouer1205的博客 3275

leetcode 215 数组中的第k个最大的元素

在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4 说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 解法1:先排序再查找 public...

斜月&三星 174

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 462

【算法-快速排序】第k大元素(Kth Largest Element)

快速排序算法改进实现寻找第k大元素

即使慢一点,也要努力的成长呀~ 6218

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

电动汽车BMS核心技术:AS8510高精度传感器解析

电池管理系统(BMS)是电动汽车的核心组件,其精度直接影响电池安全与续航表现。通过Σ-Δ ADC和斩波稳定等技术,现代BMS传感器可实现±0.5%的电流测量精度,满足汽车级AEC-Q100和ISO 26262标准。AS8510作为行业标杆芯片,采用双通道16位ADC架构,在-40°C至+150°C范围内保持稳定性能,特别适合新能源汽车的严苛环境。这类高精度传感器技术不仅解决了传统BMS的温漂难题,还为智能电池诊断、无线BMS等创新应用奠定了基础,是推动电动汽车技术进步的关键要素。

weixin_30781775的博客 533

LeetCode215:Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example, Given [3,2,1,5,6,4] and k = 2, return 5.Note:

2582

基于C#开发ABB机器人上位机系统:从操作控制到数据交互的全方位实现

ABB工业机器人是世界领先的自动化设备之一,广泛应用于焊接、装配、搬运、喷涂、包装等多个行业。机器人控制器:用于控制机器人运动、路径规划、状态监控等。上位机系统:提供人机交互界面,允许操作员与机器人进行交互,实现实时控制、参数调整和数据分析。上位机系统通过与机器人控制器通信,采集机器人状态数据,发送控制指令,实现远程监控和控制操作。通过高效的操作界面和数据交互,可以大大提高机器人的工作效率和系统的可维护性。基于C#开发ABB机器人上位机系统,能够实现高效的机器人控制与实时数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1177

【Leetcode】215. 数组中第 k 大的数字(Kth Largest Element in an Array)

Leetcode - 215 Kth Largest Element in an Array (Medium) Input: [3,2,1,5,6,4] and k = 2 Output: 5 解法一:排序 public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return nums[nums.leng...

厉兵秣码 256

驾驶行为检测数据集准备与处理详解

本文详细介绍了构建"未系安全带/打电话"检测模型的数据集准备流程。首先分析公开数据集(如StateFarm、AICityChallenge)的优缺点,并提供格式转换脚本。重点推荐自行采集+半自动标注方案:1)视频关键帧提取;2)使用预训练模型生成伪标签;3)人工修正标注;4)数据增强(光照变化、运动模糊等)。文章还包含数据配置文件编写指南,并针对类别不平衡、小目标检测等常见问题提出解决方案,如过采样、切片训练和负样本挖掘。通过这套流程可构建高质量数据集,为模型训练奠定基础。

u010117029的博客 356

Windows 上 openclaw onboard --install-daemon 命令的安装位置和启动配置

摘要:Windows系统中,执行openclaw-cnonboard--install-daemon命令会创建计划任务OpenClawGateway,该任务在用户登录时自动运行位于%USERPROFILE%.openclaw\gateway.cmd的脚本文件来启动服务。管理方法包括通过任务计划程序或命令行(schtasks)查看/启停任务,使用openclaw gateway命令操作服务,或通过删除计划任务和脚本文件完全卸载服务。该机制确保OpenClawGateway服务随系统登录自动启动。(149字)

大坡3D软件开发 1369

leetcode 215: Kth Largest Element in an Array

leetcode 215: Kth Largest Element in an Array

西施豆腐渣 1万+

WPF实战案例 | C# WPF实现大学选课系统

WPF实战案例_C# WPF实现大学选课系统, C# WPF实现大学选课系统,大作业,毕业设计,该系统实现多身份登录、修改密码、课程的管理,个人信息的管理等功能。这个源码让你快速搭建自己的应用程序,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接用程序打开,运行使用。也可直接点击EXE运行程序。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4622

【快排】数组第k大元素 LeetCode - 215. Kth Largest Element in an Array

  快排的详细总结可以看   快排的思想就是,每次选一个 pivot(比如最后一个数),然后将比它小的放它左边(或者右边),把比它大的放他右边(或者左边),相当于每次排好一个数,然后递归的排他左右两部分,这个数自己就不会再动了。   面试时经常回问的一道题就是,找出一个数组第 k 大的元素: LeetCode - 215. Kth Largest Element in an Array Find...

Bob__yuan的博客 353

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode 215:Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5.

哈哈的个人专栏 3871

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[leetcode] 215. Kth Largest Element in an Array 解题报告

题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth dis

小榕流光的专栏 2548

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

leetcode 215. Kth Largest Element in an Array | 215. 数组中的第K个最大元素(Java)

题目 https://leetcode.com/problems/kth-largest-element-in-an-array/ 题解 本题需要建立大顶堆。关于堆的数据结构,需要知道: 堆 什么是堆? 堆 是一棵 完全二叉树:即使它不是满二叉树,也是正在从左往右变满的过程中。 1)堆结构就是用数组实现的完全二叉树结构 2)完全二叉树中,如果每棵子树的 最大值都在顶部,是 大根堆 3)完全二叉树中,如果每棵子树的 最小值都在顶部,是 小根堆 4)堆结构的 heapInsert 与 heapify 操作

寒泉 5万+

LeetCode //C - 215. Kth Largest Element in an Array

【代码】LeetCode //C - 215. Kth Largest Element in an Array。

Made in Code 968

Leetcode-215. Kth Largest Element in an Array

地址:https://leetcode.com/problems/kth-largest-element-in-an-array/ 描述: Find thekth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth...

Lost2013的博客 210

215. Kth Largest Element in an Array

215. Kth Largest Element in an Array方法1:quick-sort方法2:方法3:易错点: YRB: https://www.cnblogs.com/yrbbest/p/4982861.html grandyang: http://www.cnblogs.com/grandyang/p/4539757.html 方法1:quick-sort 思路: 使用快排的思想...

wilzxu的博客 1016

数组中第K大的数(LeetCode 215. Kth Largest Element in an Array)

题目描述 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 思路 即维护一个K大小的最小堆...

qq_33466954的博客 979

【leetcode】215. Kth Largest Element in an Array

215.Kth Largest Element in an Array Find thekth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. Example 1: Input:...

lemonade13的博客 164

leetcode 215. Kth Largest Element in an Array 数组中的第K大的元素

https://leetcode.com/problems/kth-largest-element-in-an-array/ 将数组看为没有调整到位的最大堆,由于堆是完全二叉树,因此根节点与子节点的下标存在对应关系。 每次从堆中取出最大值,将其放至根节点,再与最后一个节点互换位置,然后将其从堆删除。 class Solution { public: int findKthLar...

rock4you 269

Leetcode 215 Kth Largest Element in an Array 数组中第k大的元素

在一个无须数组中找出第k大的元素。

(ง •̀_•́)ง 1447

Kth Largest Element in an Array Leetcode #215 题解[C++]

题目来源 https://leetcode.com/problems/kth-largest-element-in-an-array/description/ 题目理解 ind the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted or...

Wayne_Mai的博客 431

#Leetcode# 215. Kth Largest Element in an Array

https://leetcode.com/problems/kth-largest-element-in-an-array/ Find thekth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct ...

weixin_30262255的博客 75
上一篇: 53.Maximum Subarray(最大子串和)
下一篇: 169. Majority Element(查找多数元素)
BetweenRain
博客等级 码龄9年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值