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大个元素的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 215. 数组中的第K个最大元素 | Python

[leetcode]215. 数组中的第K个最大元素

LeetCode215. 数组中的第K个最大元素

leetcode笔记215. 数组中的第K个最大元素

[LeetCode]215. 数组中的第K个最大元素(堆)

leetcode 215. 数组中的第K个最大元素(快速排序)