郭峰博客 郭峰博客
首页
LeetCode
  • Algorithm
GitHub (opens new window)

挥码天涯

以梦为马,挥码天涯
首页
LeetCode
  • Algorithm
GitHub (opens new window)
  • 1.【简单】两数之和
  • 7.【简单】整数反转
  • 9.【简单】回文数
  • 11.【中等】回文数
  • 13.【简单】罗马数字转整数
  • 14.【简单】最长公共前缀
  • 15.【中等】三数之和
  • 19.【中等】删除链表的倒数第N个节点
  • 20.【简单】有效的括号
  • 21.【简单】合并两个有序链表
  • 26.【简单】排除数组中的重复项
  • 27.【简单】移除元素
  • 28.【简单】实现strStr
  • 35.【简单】搜索插入位置
  • 51. 【困难】数组中的逆序对.md
  • 58.【简单】最后一个单词的长度
  • 57.【中等】颜色分类
  • 100.【简单】相同的树
  • 168.【简单】缺失数字
  • 175.【简单】组合两表
  • 176.【简单】第二高的薪水.md
  • 176.【中等】第二高的薪水.md
  • 206.【简单】反转链表
  • 215.【中等】数组中的第K个最大元素
    • 题目来源:
    • 题目描述
    • 解析
  • 875.【中等】爱吃香蕉的珂珂
  • LeetCode
feng.guo
2021-09-23
目录

215.【中等】数组中的第K个最大元素

文章发布较早,内容可能过时,阅读注意甄别。

# 题目来源:

题目来源

# 题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

示例 1:

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

示例 2:

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

# 解析

使用快速排序法

class Solution {
      public int findKthLargest(int[] nums, int k) {
        Random random = new Random();
        return findK(nums, 0, nums.length - 1, nums.length - k, random);
    }

    public static int findK(int[] nums, int l, int r, int k, Random random) {
        int p = partition(nums, l, r, random);
        if (k == p) return nums[p];
        if (k < p) {
            return findK(nums, l, p - 1, k, random);
        }
        return findK(nums, p + 1, r, k, random);
    }

    private static <E extends Comparable<E>> int partition(int[] arr, int l, int r, Random random) {
        int p = l + random.nextInt(r - l + 1);
        swap(arr, l, p);
        int i = l + 1, j = r;
        // 第一步,将获得的随机值挪到最左边
        while (true) {
            while (i <= j && arr[i] < arr[l]) {
                i++;
            }
            while (j >= i && arr[j] > arr[l]) {
                j--;
            }
            if (i >= j) break;
            swap(arr, i, j);
            i++;
            j--;
        }
        swap(arr, l, j);
        return j;
    }

    private static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
微信 支付宝
#快速排序法
上次更新: 2024/03/07, 20:33:54

← 206.【简单】反转链表 875.【中等】爱吃香蕉的珂珂→

最近更新
01
2.实现一个Stack
10-30
02
01.实现一个链表结构
10-30
03
博客导引
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式