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大的数。
1、建立一个大小为k的数组,每次维护这个数组,属于暴力做法。
public class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; int[] result = new int[k]; for (int i = 0; i < k ; i++){ result[i] = nums[i]; } for (int i = k; i < len; i++){ int min = result[0]; int pos = 0; for (int j = 1; j < k; j++){ if (min > result[j]){ min = result[j]; pos = j; } } if (nums[i] > min){ result[pos] = nums[i]; } } int ans = result[0]; for (int i = 1; i < k; i++){ System.out.println(result[i] + " " + result[0]); ans = Math.min(ans, result[i]); } return ans; } }
2、利用快排
public class Solution { public int findKthLargest(int[] nums, int k) { return QuickSort(nums, k, 0, nums.length - 1); } public int QuickSort(int[] nums, int k, int start, int end){ int left = start, right = end; int num = nums[start]; for (int i = end; i > start; i--){ if (nums[i] >= num){ swap(nums, end--, i); } } swap(nums, end, start); if (k == nums.length - end){ return nums[end]; } else if (k > nums.length - end){ return QuickSort(nums, k, left, end - 1); } else { return QuickSort(nums, k, end + 1, right); } } public void swap(int[] nums, int a, int b){ int num = nums[a]; nums[a] = nums[b]; nums[b] = num; } }
3、discuss中的快排。速度更快
public class Solution { public int findKthLargest(int[] nums, int k) { return select(nums, k-1); } // Quick select 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; } }