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

在這裏插入圖片描述

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