首页 > 其他分享 >LeetCode:215.数组中的第K个最大元素

LeetCode:215.数组中的第K个最大元素

时间:2025-01-13 22:22:14浏览次数:1  
标签:index arr 215 return heap nums let 数组 LeetCode

LeetCode:215.数组中的第K个最大元素

解题思路看到“第K个最大元素”。考虑选择使用最小堆。

解题步骤构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过K,就删除堆顶。插入结束后,堆顶就是第K个最大元素。

leetcode在线 运行测试 可能是用本地环境跑分 ...有缓存 卡 大数有eroor

// 大数不通过 需要减少swap
class MinHeap{
    constructor(){
        this.heap = [];
    }
    getParentIndex(index){
        return (index-1)>>1; //等同于Math.floor((index-1)/2)
    }
    getLeftIndex(index){
        return 2*index+1;
    }
    getRightIndex(index){
        return 2*index+2; 
    }
    swap(i1,i2){
        let temp = this.heap[i1];
        this.heap[i1] = this.heap[i2];
        this.heap[i2] = temp;
    }
    shiftUp(index){
        if(index==0){return}
        let parentIndex=this.getParentIndex(index); //获取父节点的索引
        if(this.heap[parentIndex]>this.heap[index]){
            this.swap(parentIndex,index); //交换父节点和当前节点的值
            this.shiftUp(parentIndex)//继续向上调整,直到满足堆的性质为止
        }
    }
    shiftDown(index){
        let leftIndex=this.getLeftIndex(index); //获取左子节点的索引
        let rightIndex=this.getRightIndex(index); //获取右子节点的索引
        if(this.heap[leftIndex]<this.heap[index]){
            this.swap(leftIndex,index); 
            this.shiftDown(leftIndex) //继续向上调整,直到满足堆的性质为止
        }
        if(this.heap[rightIndex]<this.heap[index]){
            this.swap(rightIndex,index); 
            this.shiftDown(rightIndex) //继续向上调整,直到满足堆的性质为止
        }
    }
    insert(val){
        this.heap.push(val);
        this.shiftUp(this.heap.length - 1)
    }
    pop(){
        this.heap[0] = this.heap.pop();
        this.shiftDown(0);
    }
    peek(){
        return this.heap[0];
    }
    isEmpty(){
        return this.heap.length === 0;
    }
    size(){
        return this.heap.length;
    }
    getHeap(){
        return this.heap;
    }
    remove(val){
        for(let i=0;i<this.heap.length;i++){
            if(this.heap[i]===val) return this.heap.splice(i,1);
        }
    }
    max(k,arr){
       arr.forEach(n => {
        this.insert(n);
        if(this.size()>k){
            this.pop();
        }
       });
       return this.peek();
    }
    allInsert(arr){
        for(let i=0;i<arr.length;i++){
            this.insert(arr[i]);
        }
    }
}
var findKthLargest = function (nums, k) {
	let minHeap = new MinHeap()
  	nums.forEach(n => {
        minHeap.insert(n);
        if(minHeap.size()>k){
            minHeap.pop();
        }
    });
	return minHeap.peek();
};


//最快
var findKthLargest = function (nums, k) {
  nums = nums.sort((a, b) => b - a)
  return nums[k - 1]
};

var findKthLargest = function (nums, k) {
  for (let i = 0; i < k; i++) {
    for (let j = 0; j < nums.length - 1 - i; j++) {
      if (nums[j] > nums[j + 1])
        [nums[j], nums[j + 1]] = [nums[j + 1], nums[j]]
    }
  }
  return nums[nums.length - k]
};



function binarySearch(arr, val) {
  let low = 0
  let high = arr.length - 1
  while (low <= high) {
    // mid 表示中间值
    let mid = Math.floor(low + (high - low) / 2)
    if (arr[mid] === val) return mid
    val < arr[mid] ? high = mid - 1 : low = mid + 1
  }
  return null
}

let arr = [0, 1, 2, 3, 4, 5]
console.log(binarySearch(arr, 0));

function quickSort(arr) {
  return quick(arr, 0, arr.length - 1)
}
function quick(arr, left, right) {
  if (arr.length > 1) {
    let index = partition(arr, left, right)
    if (left < index - 1) quick(arr, left, index - 1)
    if (index < right) quick(arr, index, right)
  }
  return arr
}

var findKthLargest = function (nums, k) {
  let low = 0
  let high = nums.length - 1
  while (low <= high) {
    const mid = partition(nums, low, high)
    if (mid === k - 1) return nums[mid]
    mid < k - 1 ? low = mid + 1 : high = mid - 1
  }

}

function partition(arr, low, high) {
  let mid = Math.floor(low + (high - low) / 2)
  const pivot = arr[mid]; // 这里记得添加分号 
  // 把pivot放在arr的最后面
  [arr[mid], arr[high]] = [arr[high], arr[mid]]
  let i = low
  // 把pivot排除在外,不对pivot进行排序
  let j = high - 1
  while (i <= j) {
    while (arr[i] > pivot) i++
    while (arr[j] < pivot) j--
    if (i <= j) {
      [arr[i], arr[j]] = [arr[j], arr[i]]
      i++; j--;
    }
  }
  // 因为arr[i]是属于left的,pivot也是属于left的
  // 故我们可以把原本保护起来的pivot和现在数组的中间值交换
  [arr[high], arr[i]] = [arr[i], arr[high]]
  return i
}
//https://juejin.cn/post/6844903913150218248

'

标签:index,arr,215,return,heap,nums,let,数组,LeetCode
From: https://www.cnblogs.com/KooTeam/p/18669537

相关文章

  • java第二章数组学习
    java第二章数组数组的概念和特点数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。特点数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。创建数组对象会在内存中开......
  • leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表
    四、题目之:代码随想录https://programmercarl.com/(1)代码随想录:数组704.二分查找classSolution{publicintsearch(int[]nums,inttarget){if(target<nums[0]||target>nums[nums.length-1]){return-1;}intleft=0......
  • LeetCode Top Interview 150 - Stack
    Somescenarioswhereastackistypicallytheappropriatedatastructuretouse:1.ParenthesesMatching:Problemsthatrequirecheckingforbalancedparenthesesorbracketsoftenutilizestackstoensurethateveryopeningbrackethasacorrespondingclo......
  • LeetCode 热题 HOT 100
    点个关注,不迷路!(╯▽╰)好香~~在学习过程中,借助一些优秀的工具可以极大地提升我们的学习效率。例如,使用LeetCode插件,它能够帮助你显示力扣周赛难度分数,让你更好地了解题目的难度,从而合理安排学习计划。算法学习路线推荐基础夯实:先过B站“灵茶山艾府”的“基础算法......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......
  • LeetCode刷题笔记(Day3)【滑动窗口+螺旋矩阵】
    题号:209.长度最小的子数组力扣题目链接        【注意】:数组所有元素之和都小于target时,要设置返回0,否则会返回INT_MAX 904.水果成篮76.最小覆盖子串【T中字符不按顺序出现也算,T中可能包含重复字符】        76有示例没过去,贴在文章后面啦,希望......
  • 力扣leetcode 416.分割等和子集 动态规划 0-1背包
    题目:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums=[1,5,11,5]输出:true解释:数组可以分割成[1,5,5]和[11]。示例2:输入:nums=[1,2,3,5]输出:false解释:数组不能分割成......
  • LeetCode热题100-两数相加【JavaScript讲解】
    题目:题解:根据题目(2->4->3)+(5->6->4)=(7->0->8),根据加法的计算过程我们知道首先从低位开始算起,也就是说应该先计算2+5=7;4+6=10,向前进一位,此处取余数0;3+4+进一位的1=8;所以答案是7->0->8。最关键的是最后的进位一定要记得,如果最后相加的和需要进位!!!解题代码:/***......
  • LeetCode100之分割回文串(131)--Java
    1.问题描述        给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。        示例1输入:s="aab"输出:[["a","a","b"],["aa","b"]]    示例2 输入:s="a"输出:[["a"]]        提......
  • 网络编程I/O多路复用—动态数组
    函数声明#ifndef__VECTOR_H__#define__VECTOR_H__typedefstruct{ int*fd; intcounter; intmax_counter;}VectorFD;externVectorFD*create_vector_fd(void);externvoid destroy_vector_fd(VectorFD*);externint get_fd(VectorFD*,intindex);ext......