博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Middle-题目45:215. Kth Largest Element in an Array
阅读量:2432 次
发布时间:2019-05-10

本文共 1970 字,大约阅读时间需要 6 分钟。

题目原文:

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.
题目大意:
寻找一个数组中第k大的数。
题目分析:
(1) 朴素解法O(nlogn):排序,然后返回倒数第k个元素。
(2) Quick Select算法O(n):
S1.选择一个中轴(可以使用快排中的三者取中法),比中轴大的数放到左边,比中轴小的数放到右边;
S2.然后求出左边的长度l,若l==k,则中轴即为所求;若l>k,则从左边数组里面找第k大的数,若l

public class Solution {    public int findKthLargest(int[] nums, int k) {        return select(nums, k-1);    }    private int select(int[] nums, int k) {        int left = 0, right = nums.length-1;        while(true) {            if(left == right)                return nums[left];            int pivotIndex = medianOf3(nums, left, right);            pivotIndex = partition(nums, left, right, pivotIndex);            if(pivotIndex == k)                return nums[k];            else if(pivotIndex > k)                right = pivotIndex-1;            else                left = pivotIndex+1;        }    }    //Use median-of-three strategy to choose pivot    private int medianOf3(int[] nums, int left, int right) {        int mid = left + (right - left) / 2;        if(nums[right] > nums[left])            swap(nums, left, right);        if(nums[right] > nums[mid])            swap(nums, right, mid);        if(nums[mid] > nums[left])            swap(nums,left, mid);        return mid;    }    private int partition(int[] nums, int left, int right, int pivotIndex) {        int pivotValue = nums[pivotIndex];        swap(nums, pivotIndex, right);        int index = left;        for(int i = left; i < right; ++i) {            if(nums[i] > pivotValue) {                swap(nums, index, i);                ++index;            }        }        swap(nums, right, index);        return index;    }    private void swap(int[] nums, int a, int b) {        int temp = nums[a];        nums[a] = nums[b];        nums[b] = temp;    }}

成绩:

方法一:7ms,beats 74.67%,众数4ms,13.67%
方法二:2ms,beats 97.12%
Cmershen的碎碎念:
这道题好像是一道很经典的题,似乎在《算法导论》中有对这道题大篇幅的详细描述。

转载地址:http://lfomb.baihongyu.com/

你可能感兴趣的文章
深度分析Win 2003自动升级补丁功能(转)
查看>>
使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(转)
查看>>
来访者地址统计,很好的一个程序!(转)
查看>>
UpdateWindow函数 (转)
查看>>
移动通信的主要测量指标及注意事项(转)
查看>>
无盘网络正确网络配置建议-减少卡机蓝屏关键(转)
查看>>
如何在Delphi中调用oracle的存储过程返回数据集(转)
查看>>
ASP指南:ADO/SQL(数据存取) (转)
查看>>
赛门铁克报告启发 黑客示范如何攻入Vista!(转)
查看>>
移动通信的两种新型天线(转)
查看>>
用Win 2003 SP1向导功能打造安全服务器(转)
查看>>
只要是程序就有BUG!防堵黑客攻击心法(转)
查看>>
嵌入式Web视频点播系统实现方法(转)
查看>>
MySql正则表达式的描述(转)
查看>>
善用 SELECT INTO 功能(转)
查看>>
网易搜索引擎使用说明(转)
查看>>
深度探索C++对象模型 ( 第五部分 )(转)
查看>>
下载类网站TITLE写法对比实验结果(转)
查看>>
Windows 非法操作详解(转)
查看>>
GPRS引入对GSM网络资源的影响(转)
查看>>