leetcode-215:数组中的第K个最大元素

简介: leetcode-215:数组中的第K个最大元素

题目

题目连接

解题

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

方法一:优先队列

但是这种方法面试可能不让用

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int,vector<int>,less<int>> q;
        for(int num:nums){
            q.push(num);
        }
        while(!q.empty()){
            if(--k==0){
                return q.top();
            }
            q.pop();
        }
        return -1;
    }
};

方法二:快速选择(降序快排)

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

相关文章
|
1天前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
1天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
1天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
12 2
|
1天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
10 0
|
1天前
leetcode代码记录(下一个更大元素 II
leetcode代码记录(下一个更大元素 II
8 0
|
1天前
|
索引
leetcode代码记录(下一个更大元素 I
leetcode代码记录(下一个更大元素 I
7 0
|
1天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
1天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
10 2
|
1天前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
10 0
|
1天前
leetcode代码记录(移除元素
leetcode代码记录(移除元素
9 0

热门文章

最新文章