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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }

    private int[] partition(int[] nums, int L, int R) {
        int pivot = nums[L + (int) (Math.random() * (R - L + 1))];
        int l = L - 1, r = R + 1, cur = L;
        while (cur < r) {
            if (nums[cur] == pivot) {
                cur++;
            } else if (nums[cur] > pivot) {
                swap(nums, ++l, cur++);
            } else {
                swap(nums, --r, cur);
            }
        }
        return new int[]{l + 1, r - 1};
    }


    private int solve(int[] nums, int k) {
        int l = 0, r = nums.length - 1;

        while (l < r) {
            int[] partition = partition(nums, l, r);
            if (k >= partition[0] && k <= partition[1]) {
                return nums[k];
            } else if (k < partition[0]) {
                r = partition[0] - 1;
            } else {
                l = partition[1] + 1;
            }
        }

        return nums[l];
    }

    public int findKthLargest(int[] nums, int k) {
        return solve(nums, k - 1);
    }
}
posted @ 2021-12-08 14:14  Tianyiya  阅读(17)  评论(0)    收藏  举报