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 ≤ 數組的長度。

思路:

  • 第K大 = 第N-K小
  • 快排優化
 private int[] nums;

  public int findKthLargest(int[] nums, int k) {
    this.nums = nums;
    int len = nums.length;
    return quickSort(0, len - 1, len - k);
  }

  public int quickSort(int left, int right, int smallest) {
    if (left == right) return nums[left];

    Random random = new Random(); // 隨機獲取index值
    int parIndex = left + random.nextInt(right - left);

    parIndex = partition(left, right, parIndex); // 劃分後的parIndex

    if (parIndex == smallest) { // 第smallest小的已經拍好了
      return nums[parIndex];
    } else if (smallest < parIndex) { // 往左邊
      return quickSort(left, parIndex - 1, smallest);
    } else {
      return quickSort(parIndex + 1, right, smallest);
    }
  }

  private int partition(int left, int right, int parIndex) {
    int par = this.nums[parIndex];

    swap(parIndex, right); // 分割點放在最右側
    int storeIndex = left;

    for (int i = left; i <= right; i++) { // 小於分割點的都放在左側
      if (nums[i] < par) {
        swap(storeIndex++, i);
      }
    }

    swap(storeIndex, right); // 分割點歸位

    return storeIndex;
  }

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

 

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