LeetCode-215数组中的第K个最大元素-快排-cpp

LeetCode-day45-数组中的第K个最大元素-快排-cpp

题目回顾

传送门

在未排序的数组中找到第 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 ≤ 数组的长度。

题解

参考题解思路
时间复杂度: 快排 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))
空间复杂度 O ( N ) O(N) O(N)
执行用时: 28 m s 28 ms 28ms

简单粗暴的排序法
先排序,然后直接取第k位置就可以

冒泡
类似于冒泡排序的思路,从小往大冒泡,冒k次之后就得到第k大的数了

小根堆
维护一个小根堆,遍历数组,如果当前元素大于根,则加入堆中;如果加入后堆的元素数量多于k,则弹出根元素。 遍历一遍之后,根就是第k大的元素。

类似快排的划分思路
先任取一个数,把比它大的数移动到它的左边,比它小的数移动到它的右边。移动完成一轮后,看该数的下标(从0计数),如果刚好为k-1则它就是第k大的数,如果小于k-1,说明第k大的数在它右边,如果大于k-1则说明第k大的数在它左边,取左边或者右边继续进行移动,直到找到。

此处只用了快排

cpp

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
    public:
        static bool ismax(const int &a,const int &b){
            return a>b;
        }
        int findKthLargest(vector<int>& nums, int k) {
            sort(nums.begin(),nums.end(),ismax);
            return nums[k-1];
        }
};

int main(){
    Solution sol=Solution();
    vector<int> vec={1,2,3,4,165,24};
    //result repect is : 24
    cout<<sol.findKthLargest(vec,2);
        
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值