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
用quick selecte的方法
Given
[3,2,1,5,6,4]
and k = 2, return 5.用quick selecte的方法
//pivot为left public class Solution { public int findKthLargest(int[] nums, int k) { return find(nums, 0, nums.length - 1, nums.length - k); } public int find (int[] nums, int i, int j, int k) { int left = i; int right = j; int pivot = nums[left]; while (left < right) {//为< 不是<= while (left < right && nums[right] > pivot) {//必须先right-- right--; } while (left < right && nums[left] <= pivot) { left++; } swap(nums, left, right); } swap(nums,right, i); if (left == k) { return nums[k]; } else if (left < k) { return find(nums, left + 1, j, k); } else { return find(nums, i, left - 1, k); } } public void swap(int[] nums, int i, int j) { int tem = nums[i]; nums[i] = nums[j]; nums[j] = tem; } } //pivot为right public class Solution { public int findKthLargest(int[] nums, int k) { return find(nums, 0, nums.length - 1, nums.length - k); } public int find (int[] nums, int i, int j, int k) { int left = i; int right = j; int pivot = nums[right]; while (left < right) { while (left < right && nums[left] < pivot) {//右pivot时候先左边 反之亦然 left++; } while (left < right && nums[right] >= pivot) { right--; } if (left < right) {//此判定可有可无, 因为不会出现left> right情况 swap(nums, left, right); } } swap(nums,left, j); if (left == k) { return nums[k]; } else if (left < k) { return find(nums, left + 1, j, k); } else { return find(nums, i, left - 1, k); } } public void swap(int[] nums, int i, int j) { int tem = nums[i]; nums[i] = nums[j]; nums[j] = tem; } }Priority Queue的解法
public class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> queue = new PriorityQueue<Integer>(); for (int i : nums) { queue.offer(i); } for (int i = 0; i < nums.length - k ; i++) { queue.poll(); } return queue.peek(); } }
没有评论:
发表评论