數組中第K大的數

原題

  Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
  For example,
  Given [3,2,1,5,6,4] and k = 2, return 5.
  Note:
  You may assume k is always valid, 1 ≤ k ≤ array’s length.java

題目大意

  從一個未經排序的數組中找出第k大的元素。注意是排序以後的第k大,而非第k個不重複的元素能夠假設k必定是有效的, 1 ≤ k ≤ 數組長度算法

解題思路

  O(n)解法:快速選擇(QuickSelect)算法數組

代碼實現

算法實現類ui

import java.util.Collections;

public class Solution {

    public int findKthLargest(int[] nums, int k) {

        if (k < 1 || nums == null || nums.length < k) {
            throw new IllegalArgumentException();
        }

        return findKthLargest(nums, 0, nums.length - 1, k);
    }

    public int findKthLargest(int[] nums, int start, int end, int k) {

        // 中樞值
        int pivot = nums[start];
        int lo = start;
        int hi = end;

        while (lo < hi) {
            // 將小於中樞值的數移動到數組左邊
            while (lo < hi && nums[hi] >= pivot) {
                hi--;
            }
            nums[lo] = nums[hi];

            // 將大於中樞值的數移動到數組右邊
            while (lo < hi && nums[lo] <= pivot) {
                lo++;
            }
            nums[hi] = nums[lo];
        }

        nums[lo] = pivot;

        // 若是已經找到了
        if (end - lo + 1 == k) {
            return pivot;
        }
        // 第k大的數在lo位置的右邊
        else if (end - lo + 1 > k){
            return findKthLargest(nums, lo + 1, end, k);
        }
        // 第k大的數在lo位置的左邊
        else {
            // k-(end-lo+1)
            // (end-lo+1):表示從lo位置開始到end位置的元素個數,就是舍掉右半部分
            // 原來的第k大變成k-(end-lo+1)大
            return findKthLargest(nums, start, lo - 1, k - (end - lo + 1));
        }
    }
}
相關文章
相關標籤/搜索