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

215. 数组中的第K个最大元素(中等)

时间:2024-04-01 18:45:32浏览次数:22  
标签:215 nums int larger 中等 maxHeapify 数组 public size

核心思想
手写堆
构建一个大顶堆,删除k-1个堆顶元素。
为什么是size / 2 - 1
考虑最后一个元素的下标 size - 1 那么父节点为 (size - 1) / 2

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int size = nums.length;
        buildHeap(nums, size);
        for(int i = 0; i < k - 1; i++){
            swap(nums, 0, size - 1);
            size --;
            maxHeapify(nums, 0, size);
        }
        return nums[0];
    }


    public void buildHeap(int[] nums, int size){
        for(int i = size / 2 - 1; i >= 0; i--){
            maxHeapify(nums, i, size);
        }
    }

    public void maxHeapify(int[] nums, int i, int size){
        int l = i * 2 + 1;
        int r = i * 2 + 2;

        int larger = i;
        if(l < size && nums[l] > nums[larger])
            larger = l;

        if(r < size && nums[r] > nums[larger])
            larger = r;

        if(larger != i){
            swap(nums, larger, i);
            maxHeapify(nums, larger, size);
        }
    }

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

标签:215,nums,int,larger,中等,maxHeapify,数组,public,size
From: https://www.cnblogs.com/ganyq/p/18109149

相关文章

  • 2580. 统计将重叠区间合并成组的方案数(中等)
    核心思想先按第一个元素排序,原区间重合的合并为一个,计算合并完后的区间个数。每个区间都有2个选择,res不断乘2。classSolution{publicintcountWays(int[][]ranges){longres=1;finalintMOD=(int)(1e9+7);Arrays.sort(ranges,(......
  • 503. 下一个更大元素 II(中等)
    核心思想维护一个单调递减的单调栈(非严格)但是由于是循环的,做两次循环即可代码publicint[]nextGreaterElements(int[]nums){Deque<Integer>dq=newArrayDeque<>();int[]res=newint[nums.length];Arrays.fill(res,-1);for(int......
  • 平均数为k的最长连续子数组(美团2024届秋招笔试第三场编程真题)
    核心思想每个数-k计算前缀和并放入mapkey=前缀和value=当前下标由于需要最长的子数组所以只记录最先存在的下标出现重复的前缀和说明存在平均值为k的区间[pre+1,i]importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Sc......
  • 【学习笔记】字符串基础:后缀数组
    后置数组好难啊好难啊好难啊好难啊好难啊好难啊最后还是听了不知道从ftp里搞出来的yspm讲课视频才听懂的,但是yspm用的屏幕绘画是看不见的比较尊贵,然后开了画图本文约定字符串下标从\(1\)开始后缀数组后缀数组,即\(\text{SA(SuffixArray)}\),主要关系到两个数组:\(sa......
  • leedcode-区域和检索 - 数组不可变
    自己写的,耗时很长classNumArray:def__init__(self,nums:List[int]):#初始化NumArray类,接收一个整数列表nums作为参数self.nums=nums#将传入的nums列表存储为对象的属性defsumRange(self,left:int,right:int)->int:"""......
  • 【二叉树】Leetcode 437. 路径总和 III【中等】
    路径总和III给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1:**输入:**root=[10,5,-3,3,2,null,11,3,......
  • 动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】
    一.为什么要有动态内存分配我们知道,当我们创建变量的时候,我们会向系统申请一定大小的空间内存。比如inta=10或者intarr[10];我就向内存申请了4或者40个字节的大小来存放数据。但是当我们一旦申请好这个空间,大小就无法调整了。但是对于空间的需求,不仅仅就只有上面的情况。有时......
  • js数组置顶元素(将某一项移到首位)
    方法1letarr=[1,2,3]//假设选中的元素为第二个arr.forEach((item,index)=>{ if(item===2){ arr.unshift(arr.splice(index,1)[0])}})console.log(arr)//[2,1,3]方法2letarr=[1,2,3,4]letkey=3//假设选中的元素为第二个for(leti=1;i<arr.length;i++){if(arr[i]==......
  • Offer必备算法17_子数组子串dp_八道力扣题详解(由易到难)
    目录①力扣53.最大子数组和解析代码②力扣918.环形子数组的最大和解析代码③力扣152.乘积最大子数组解析代码④力扣1567.乘积为正数的最长子数组长度解析代码⑤力扣413.等差数列划分解析代码⑥力扣978.最长湍流子数组解析代码⑦力扣139.单词拆分解析代码......
  • 【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期
    一、vue2和vue3的区别1.性能优化:        Vue3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。虚拟DOM重构:Vue3中对虚拟DOM进行了重构,使得更新算法更加高效,减少了更新时的开销,提升了性能。静态树提升:Vue3可以通过静态树提升技术......