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

简介: leetcode-215-数组中的第K个最大元素

网络异常,图片无法展示
|


[题目地址][B站地址]


给定整数数组 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 <= k <= nums.length <= 104
  • -104 <= nums[i] <= 104


sort 排序


本题要我们返回数组中第 k 大的值,最简单直接的方法就是将数组进行降序排列,然后返回第 k 个元素即可


代码如下:


var findKthLargest = function(nums, k) {
  // 降序排序
  nums.sort((a,b) => b-a);
  // 返回排序后第k个元素
  return nums[k-1]
};
复制代码


小顶堆


涉及到维护前 k 个最值的问题,都可以通过堆来解题


本题要维护的是前 k 个最大值,所以我们可以通过小顶堆来维护前 k 个最大值


最后堆顶元素就是第 k 个最大值


代码如下:


// 小顶堆
class MinHeap {
  constructor(k){
    this.arr = [];
    this.size = 0;
    this.max = k;
  }
  // 插入操作
  push(val){
    this.arr.push(val);
    this.size++;
    // 自下向上平衡调整
    if(this.size>1){
      let cur = this.size-1,
      parent = (cur-1)>>1;
      while(cur>0&&this.arr[cur]<this.arr[parent]){
        [this.arr[parent],this.arr[cur]] =
        [this.arr[cur],this.arr[parent]]
        cur = parent,parent = (cur-1)>>1;
      }
    }
    // 如果堆中元素数量超过K个,弹出堆顶元素
    if(this.size>this.max) this.pop();
  }
  // 弹出操作
  pop(){
    this.arr[0] = this.arr.pop();
    this.size--;
    // 自上向下平衡调整
    let cur = 0,
    childl = 1,childr = 2;
    while(
      (childl<this.size&&this.arr[childl]<this.arr[cur]) ||
      (childr<this.size&&this.arr[childr]<this.arr[cur])
    ){
      if(childr<this.size&&this.arr[childr]<this.arr[childl]){
        [this.arr[cur],this.arr[childr]] =
        [this.arr[childr],this.arr[cur]]
        cur = childr
      }else{
        [this.arr[cur],this.arr[childl]] =
        [this.arr[childl],this.arr[cur]]
        cur = childl
      }
      childl = cur*2+1,childr = cur*2+2;
    }
  }
  // 返回堆顶元素
  top(){
    return this.arr[0]
  }
}
var findKthLargest = function(nums, k) {
  // 创建小顶堆实例
  const heap = new MinHeap(k);
  // 循环输入数组
  for(let i = 0;i<nums.length;i++){
    // 当堆中数量小于k或者当前元素大于堆顶元素的时候,将当前元素插入堆中
    if(heap.size<k||nums[i]>heap.top()){
      heap.push(nums[i])
    }
  }
  // 返回堆顶元素
  return heap.top();
};
复制代码


至此我们就完成了 leetcode-215-数组中的第K个最大元素


如有任何问题或建议,欢迎留言讨论!

相关文章
|
2天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
5 0
|
2天前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
6 0
|
2天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
6 1
|
2天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
10 0
|
2天前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
5 0
|
2天前
力扣随机一题 6/28 数组/矩阵
力扣随机一题 6/28 数组/矩阵
5 0
|
2天前
|
存储 安全
力扣每日一题 6/21 数组
力扣每日一题 6/21 数组
4 0
|
16天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
16天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
17天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值