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

本篇博客介绍了解决LeetCode 215题——如何在未排序的数组中找到第k大的元素。通过应用快速选择算法的partition思想,可以实现平均时间复杂度为O(n)的解决方案。文章详细阐述了算法思路,包括如何根据划分点确定继续搜索的区域,直至找到第k大的数。
摘要由CSDN通过智能技术生成

题目链接: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 distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 
You may assume k is always valid, 1 ≤ k ≤ array's length.



思路:这题是利用了quick-select的算法,也就是快速排序的partition,这个方法的理论时间复杂度是O(n),是一种非常有用的工具.

使用分治每次将数组划分为两段,并且返回划分点的位置,如果这个位置恰好是我们要的第k大的数,那么返回这个数即可,

否则如果返回的位置小于要找的位置,则向右边的一半数组继续寻找

如果返回的位置大于要找的位置,则向左边寻找.

代码如下:

class Solution {
public:
    int partition(vector<int>& nums, int left, int right)
    {
        int val = nums[right];
        for(int i = left; i < right; i++)
            if(nums[i] < val) swap(nums[left++], nums[i]);
        swap(nums[right], nums[left]);
        return left;
    }
    
    int findKthLargest(vector<int>& nums, int k) {
        int len = nums.size(), left = 0, right = len-1, ans, pos = len-k;
        while((ans=partition(nums, left, right)) != pos)
            ans<pos?left = ans + 1: right = ans - 1;
        return nums[len-k];
    }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值