LeetCode #215 数组中的第K大个元素

题目

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

示例

在这里插入图片描述

最佳代码

在写之前务必复习下快排

package com.vleus.algorithm.sort;

import java.util.Arrays;

/**
 * @author vleus
 * @date 2021年07月26日 22:04
 */
public class CustomQuickSort {

    public static void quickSort(int[] array) {

        int len = array.length;
        if (array == null || len == 0) {
            return;
        }

        quickSort2(array,0,array.length-1);
    }

    public static void quickSort2(int[] arr, int left, int right) {

        if (left > right) {
            return;
        }

        int base = arr[left];
        int i = left;
        int j = right;

        while (i != j) {
            //从j开始遍历,从右到左找比j小的数
            while (arr[j] >= base && i < j) {
                j--;
            }

            while (arr[i] <= base && i < j) {
                i++;
            }

            if (i < j) {
                swap(arr,i,j);
            }
        }

        arr[left] = arr[i];
        arr[i] = base;

        quickSort2(arr, left, i - 1);
        quickSort2(arr, i + 1, right);

    }

    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};
        quickSort(nums);
        System.out.println(Arrays.toString(nums));

    }
}

第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));
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值