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.
解题思路:
本题是《算法导论》原题,9.2节用归并的思路给出了时间复杂度为O(n)的算法,9.3节给出了最坏时间为O(n)的算法(就是讨论区的第一个),实现起来比较麻烦(笔者提交Wrong Answer了几次,不想搞了),本题最简单的快排即可实现,JAVA实现如下:
public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return nums[nums.length-k]; }
另外,网上看人用归并排序,传送如下:
public int findKthLargest(int[] nums, int k) { return findK(nums, nums.length-k, 0, nums.length-1); } private int findK(int[] nums, int k, int i, int j) { if(i>=j) return nums[i]; int m = partition(nums, i, j); if(m==k) return nums[m]; else if(m<k) { return findK(nums, k, m+1, j); } else { return findK(nums, k, i, m-1); } } private int partition(int[] nums, int i, int j) { int x = nums[i]; int m = i; int n = i+1; while(n<=j){ if(nums[n]<x) { swap(nums, ++m, n); } ++n; } swap(nums,i, m); return m; } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; }