lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

1. 题目

 

考察点

这道题的考察点是数组,排序,堆和快速选择算法。

  • 你需要知道如何对数组进行排序,以及不同的排序算法的时间和空间复杂度。
  • 你需要知道如何使用堆来维护一个有序的集合,以及如何利用堆的性质来快速找到第k个最大的元素。
  • 你需要知道如何使用快速选择算法来在平均O(n)的时间内找到第k个最大的元素,以及如何处理数组中的重复元素和边界情况。

这道题是一个经典的面试问题,可以帮助你提高你的编程能力和逻辑思维。

 

2. 解法

有多种方法可以用Java实现,例如:

  • 使用Arrays.sort()方法对数组进行排序,然后返回数组的第nums.length - k个元素。
  • 使用PriorityQueue类创建一个最大堆,将数组中的所有元素加入堆中,然后弹出k-1个元素,最后返回堆顶元素。
  • 使用快速选择算法,根据一个随机的基准元素将数组分为两部分,如果基准元素的位置等于nums.length - k,则返回该元素;如果小于,则在右边部分继续查找;如果大于,则在左边部分继续查找。

 

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 方法一:排序
public class Solution1 {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length - k];
    }
}
 
// 方法二:最大堆
public class Solution2 {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
        for (int i : nums) {
            maxHeap.offer(i);
        }
        while (k-- > 1) {
            maxHeap.poll();
        }
        return maxHeap.poll();
    }
}
 
// 方法三:快速选择
public class Solution3 {
    public int findKthLargest(int[] nums, int k) {
        int start = 0;
        int end = nums.length - 1;
        int index = nums.length - k;
        while (start < end) {
            int pivot = partition(nums, start, end);
            if (pivot < index) {
                start = pivot + 1;
            } else if (pivot > index) {
                end = pivot - 1;
            } else {
                return nums[pivot];
            }
        }
        return nums[start];
    }
 
    int partition(int[] nums, int start, int end) {
        int pivot = start;
        while (start <= end) {
            while (start <= end && nums[start] <= nums[pivot]) {
                start++;
            }
            while (start <= end && nums[end] > nums[pivot]) {
                end--;
            }
            if (start > end) {
                break;
            }
            swap(nums, start, end);
        }
        swap(nums, end, pivot);
        return end;
    }
 
    void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

  

3. 总结

posted on   白露~  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示