[路飞]leetcode-215.数组中的第K个最大元素

77 阅读1分钟

给定整数数组 nums 和整数 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

有两种解题思路一个是小顶堆一个是快排,小顶堆无论是速度和内存都优与快排  

解题1:小顶堆

var findKthLargest = function (nums, k) {
  const heap = new Heap(k);
  while (nums.length) {
    const item = nums.pop();
    heap.push(item);
  }
  return heap.arr[0];
};

class Heap {
  constructor(k) {
    this.arr = [];
    this.k = k;
  }
  size() {
    return this.arr.length;
  }
  push(val) {
    if (this.size() < this.k) {
      this.arr.push(val);
      this._sortBack();
    } else if (val > this.arr[0]) {
      this.arr[0] = val;
      this._sortFront();
    }
  }
  pop() {
    const val = this.arr[0];
    const back = this.arr.pop();
    if (this.arr.length) {
      this.arr[0] = back;

      this._sortFront();
    }
    return val;
  }
  _sortBack() {
    let i = this.arr.length - 1;
    while (i > 0 && this.arr[i] < this.arr[Math.floor((i - 1) / 2)]) {
      [this.arr[i], this.arr[Math.floor((i - 1) / 2)]] = [
        this.arr[Math.floor((i - 1) / 2)],
        this.arr[i],
      ];
      i = Math.floor((i - 1) / 2);
    }
  }

  _sortFront() {
    let i = 0;
    while (i * 2 + 1 < this.size()) {
      let temp = i;
      if (this.arr[temp] > this.arr[i * 2 + 1]) temp = i * 2 + 1;
      if (i * 2 + 2 < this.size() && this.arr[temp] > this.arr[i * 2 + 2])
        temp = i * 2 + 2;
      if (temp === i) break;
      [this.arr[i], this.arr[temp]] = [this.arr[temp], this.arr[i]];
      i = temp;
    }
  }
}

解题2:快排

var quick_sort = function (arr, l, r) {
  if (l >= r) return;
  let l1 = l;
  r1 = r;
  while (l1 < r1) {
    while (l1 < r1 && arr[r1] >= arr[l]) {
      r1--;
    }
    while (l1 < r1 && arr[l1] <= arr[l]) {
      l1++;
    }
    swap(arr, r1, l1);
  }
  swap(arr, r1, l);
  quick_sort(arr, l, r1 - 1);
  quick_sort(arr, r1 + 1, r);
};

var swap = function (arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
};
var findKthLargest = function (arr, k) {
  quick_sort(arr, 0, arr.length - 1);
 return arr[arr.length-k]
};