Middle-题目45：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 sorted order, not the kth distinct element.

（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;
}

}

Cmershen的碎碎念：

• 本文已收录于以下专栏：

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

leetcode 215: Kth Largest Element in an Array

leetcode 215: Kth Largest Element in an Array
• 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
• 2015年05月27日 00:11
• 3227

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

• bruce128
• 2016年02月23日 14:00
• 1810

215. Kth Largest Element in an Array-Python

• 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
• 2015年08月28日 06:57
• 4341

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

• qq508618087
• 2016年02月21日 07:29
• 1080

leetcode 215 Kth Largest Element in an Array C++

• a2331046
• 2016年12月05日 15:54
• 320

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

• bwstardust
• 2017年06月11日 22:56
• 100

LeetCode -- Kth Largest Element in an Array

LeetCode -- Kth Largest Element in an Array
• csharp25
• 2015年11月29日 22:25
• 1050

举报原因： 您举报文章：Middle-题目45：215. Kth Largest Element in an Array 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)