LeetCode #215 数组中的第K大个元素
Posted 三笠·阿卡曼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode #215 数组中的第K大个元素相关的知识,希望对你有一定的参考价值。
题目
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例
最佳代码
package com.vleus.algorithm.sort;
import java.util.Arrays;
import java.util.Random;
/**
* @author vleus
* @date 2021年05月23日 22:14
*/
public class KthLargestElement {
//方法一:直接排序
public int findKthLargest1(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
//方法二:基于快排的选择
public static int findKthLargest(int[] nums, int k) {
//利用快速排序
return quickSelect(nums, 0, nums.length - 1, nums.length - k);
}
public static int quickSelect(int[] nums, int start, int end, int index) {
//找到基准位置返回即可
int position = randomPosition(nums, start, end);
//判断当前pivot是否为index
if (position == index) {
return nums[position];
} else {
return position > index ? quickSelect(nums, start, position - 1, index) : quickSelect(nums, position + 1, end, index);
}
}
//实现随机分区方法
public static int randomPosition(int[] nums, int start, int end) {
Random random = new Random();
int randIndex = start + random.nextInt(end - start + 1);
int i = start;
int j = end;
int temp = nums[start];
while (i < j) {
while (i < j && temp <= nums[j]) {
j--;
}
while (i < j && temp >= nums[i]) {
i++;
}
if (i < j) {
swap(nums,i,j);
}
}
nums[start] = nums[i];
nums[j] = temp;
return j;
}
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
int nums[] = {3, 45, 78, 36, 52, 11, 39, 36, 52};
System.out.println(findKthLargest(nums, 1));
System.out.println(findKthLargest(nums, 2));
System.out.println(findKthLargest(nums, 3));
System.out.println(findKthLargest(nums, 4));
System.out.println(findKthLargest(nums, 5));
System.out.println(findKthLargest(nums, 6));
System.out.println(findKthLargest(nums, 7));
System.out.println(findKthLargest(nums, 8));
System.out.println(findKthLargest(nums, 9));
}
}
以上是关于LeetCode #215 数组中的第K大个元素的主要内容,如果未能解决你的问题,请参考以下文章