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.java
從一個未經排序的數組中找出第k大的元素。注意是排序以後的第k大,而非第k個不重複的元素能夠假設k必定是有效的, 1 ≤ k ≤ 數組長度算法
O(n)解法:快速選擇(QuickSelect)算法數組
算法實現類ui
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)); } } }