Leetcode:NO.215 数组中的第K个最大元素 二分法

题目

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

示例 1:

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

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

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array

解题记录

  • 直接通过api进行排序
  • 取排序后数组后k个
/**
 * @author ffzs
 * @describe
 * @date 2020/6/29
 */
public class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

在这里插入图片描述

进阶

  • 通过使用二分查找的快速排序进行确定第K大的数
  • 通过选取中间值,通过交换前后值的方法,确定一个点right,使得其为一个mid值分解线,就是说大于j的都是大于等于mid的值
  • 如果r-right大于等于k说明,K大在右边
  • 否者在左边
  • 二分递归,知道只剩一个值,left==right时,这个值便是k
/**
 * @author ffzs
 * @describe
 * @date 2020/6/29
 */
public class Solution2 {
    public static int findKthLargest(int[] nums, int k) {
        return quickSort(nums, 0, nums.length - 1, k);
    }

    private static int quickSort (int[] nums, int l, int r, int k) {
        if (l == r) return nums[l];
        int mid = nums[l+r >> 1];
        int left = l, right = r;
        while (true) {
            while (nums[left] < mid) left ++;
            while (nums[right] > mid) right --;
            if (left < right) swap(nums, left++, right--);
            else break;
        }
        if (r-right>=k) return quickSort(nums, right +1, r, k);
        else return quickSort(nums, l, right, k-(r-right));
    }

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

    public static void main(String[] args) {
        int[] nums = {3,2,3,1,2,4,5,5,6};
        System.out.println(findKthLargest(nums, 4));
    }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章