leetcode.排序.215数组中的第k个最大元素-Java

1. 具体题目

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 :  输入: [3,2,1,5,6,4] 和 k = 2  输出: 5

2. 思路分析

方法一:最直接的方法是直接调用 Java 的排序方法 Arrays.sort,排序算法为快速排序,时间复杂度O(nlogn)

方法二:利用堆排序算法,维护一个大小等于 k 的小顶堆,最后取堆顶元素即可,可借助 Java 的数据结构 PriorityQueue(有序队列)

方法三:基于切分的快速选择,由于每次切分后都返回切分点下标值,所以可以找到下标为目标值的切分点,返回该切分点元素。

3. 代码

快速选择代码:

 1 public int findKthLargest(int[] nums, int k) {
 2         int target = nums.length - k;
 3         int l = 0, h = nums.length - 1;
 4         while(l < h){
 5             int index = partition(nums, l, h);
 6             if(target > index){
 7                 l = index + 1;
 8             }else if(target < index){
 9                 h = index - 1;
10             }else{
11                 return nums[target];
12             }
13         }
14         return nums[target];
15     }
16     //切分算法
17     private int partition(int[] nums, int l, int h){
18         int flag = nums[l];   
19         while(l < h){
20             while(nums[h] >= flag && l < h) h--;
21             swap(nums, l, h);   
22             while(nums[l] <= flag && l < h) l++;
23             swap(nums, l, h);   
24         }
25         return l;   
26     }
27     //元素交换
28     private void swap(int[] nums, int i, int j){
29         int temp = nums[i];
30         nums[i] = nums[j];
31         nums[j] = temp;
32     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11959560.html