Middle-题目45:215. Kth Largest Element in an Array

原创 2016年05月31日 16:05:58

题目原文:
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的碎碎念:
这道题好像是一道很经典的题,似乎在《算法导论》中有对这道题大篇幅的详细描述。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

LeetCode215: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 so...
  • u012501459
  • u012501459
  • 2015年07月09日 21:36
  • 957

leetcode 215: Kth Largest Element in an Array

leetcode 215: Kth Largest Element in an Array
  • xudli
  • xudli
  • 2015年05月29日 08:47
  • 10630

LeetCode 215: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 so...
  • sunao2002002
  • sunao2002002
  • 2015年05月27日 00:11
  • 3227

LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解

题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ 215. Kth Largest Elem...
  • bruce128
  • bruce128
  • 2016年02月23日 14:00
  • 1810

215. Kth Largest Element in an Array-Python

利用Python最大堆解决问题。Find the kth largest element in an unsorted array. Note that it is the kth largest e...
  • daigualu
  • daigualu
  • 2017年07月07日 17:42
  • 563

【LeetCode-面试算法经典-Java实现】【215-Kth Largest Element in an Array(数组中第K大的数)】

【215-Kth Largest Element in an Array(数组中第K大的数)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月28日 06:57
  • 4341

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

题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ Find the kth largest element i...
  • qq508618087
  • qq508618087
  • 2016年02月21日 07:29
  • 1080

leetcode 215 Kth Largest Element in an Array C++

帮别人找bug,顺便把这道题做了,用的是快排的方式。 int findKLargestElement(int k, vector& nums, int low, int high) { ...
  • a2331046
  • a2331046
  • 2016年12月05日 15:54
  • 320

算法课第16周第1题—— 215. Kth Largest Element in an Array

题目描述: Find the kth largest element in an unsorted array. Note that it is the kth largest elemen...
  • bwstardust
  • bwstardust
  • 2017年06月11日 22:56
  • 100

LeetCode -- Kth Largest Element in an Array

LeetCode -- Kth Largest Element in an Array
  • csharp25
  • csharp25
  • 2015年11月29日 22:25
  • 1050
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目45:215. Kth Largest Element in an Array
举报原因:
原因补充:

(最多只允许输入30个字)