博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组中第K大的数
阅读量:6192 次
发布时间:2019-06-21

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

hot3.png

原题

  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.

题目大意

  从一个未经排序的数组中找出第k大的元素。注意是排序之后的第k大,而非第k个不重复的元素可以假设k一定是有效的, 1 ≤ k ≤ 数组长度

解题思路

  O(n)解法:快速选择(QuickSelect)

代码实现

算法实现类

import java.util.Collections;public class Solution {    public int findKthLargest(int[] nums, int k) {        if (k < 1 || nums == null || nums.length < k) {            throw new IllegalArgumentException();        }        return findKthLargest(nums, 0, nums.length - 1, k);    }    public int findKthLargest(int[] nums, int start, int end, int k) {        // 中枢值        int pivot = nums[start];        int lo = start;        int hi = end;        while (lo < hi) {            // 将小于中枢值的数移动到数组左边            while (lo < hi && nums[hi] >= pivot) {                hi--;            }            nums[lo] = nums[hi];            // 将大于中枢值的数移动到数组右边            while (lo < hi && nums[lo] <= pivot) {                lo++;            }            nums[hi] = nums[lo];        }        nums[lo] = pivot;        // 如果已经找到了        if (end - lo + 1 == k) {            return pivot;        }        // 第k大的数在lo位置的右边        else if (end - lo + 1 > k){            return findKthLargest(nums, lo + 1, end, k);        }        // 第k大的数在lo位置的左边        else {            // k-(end-lo+1)            // (end-lo+1):表示从lo位置开始到end位置的元素个数,就是舍掉右半部分            // 原来的第k大变成k-(end-lo+1)大            return findKthLargest(nums, start, lo - 1, k - (end - lo + 1));        }    }}

转载于:https://my.oschina.net/u/2822116/blog/813519

你可能感兴趣的文章
从Zend Engine 2.0的设计蓝图(草稿)看PHP的将来
查看>>
向用户授予对象特权
查看>>
【HeadFirst 设计模式学习笔记】5 单例模式
查看>>
Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现
查看>>
Aspose.Pdf for Java 4.0 发布
查看>>
软件设计师.NET认证考试测试卷(试题及答案)
查看>>
C语言初学者代码中的常见错误与瑕疵(14)
查看>>
已知ip地址和其子网掩码如何求网络号子网号主机号
查看>>
asp.net 导出excel的一种方法
查看>>
html块状元素、内联元素
查看>>
WCF服务端与客户端时间匹配问题
查看>>
ruby之各种概念
查看>>
array_column php 函数 自定义版本 php_version<5.5
查看>>
关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)
查看>>
RHCS集群理论暨最佳实践
查看>>
第3章 Java语言基础----声明常量
查看>>
iPhone取消软件更新上边的1
查看>>
CentOS禁用root本地或远程ssh登录
查看>>
多表连接的三种方式详解 hash join、merge join、 nested loop
查看>>
SQL Server 自定义函数(1)把某一列多行的值拼接成一个字符串
查看>>