215 力扣数组中对的第k大 手写小根堆 class myheap(int capacity){ int size = 0;int[] heapArray= new int[capacity+1] }

文章目录

code

//给定整数数组 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 <= 10⁴ 
// -10⁴ <= nums[i] <= 10⁴ 
// 
// Related Topics 数组 分治 快速选择 排序 堆(优先队列) 👍 1595 👎 0


class Solution {
    public int findKthLargest(int[] nums, int k) {
        class heap{
            int size = 0;
            int[] heapArr;

            private heap(int capacity){     // 不要用 size ,easy 混淆,之前就错在,多写了一句 this.size = size;
            	
                this.heapArr = new int[capacity+1];
            }

            public boolean add(int k){
               if(size > heapArr.length){
                    return false;
                }
                heapArr[++size] = k;
                up(size);
                return true;
            }

            private void up(int cur){
                while((cur>>1) >= 1){
                    int parent  = cur>>1;
                    if( heapArr[parent] > heapArr[cur] ){
                        int tem = heapArr[cur];
                        heapArr[cur] = heapArr[parent];
                        heapArr[parent]= tem;
                        cur = parent;
                    }else{
                        break;
                    }
                }
             }


            public int pop(){
                int returnVal = heapArr[1];
                heapArr[1] = heapArr[size];  // 用size,别用heaparr.length-1
                size--;
                Down(size);
                return returnVal;
            }

            private void Down(int size){
                int cur = 1;
                while((cur<<1) <= size){
                    int child = cur<<1;
                    if((child+1) <= size && heapArr[child+1] < heapArr[child]){
                        child++;
                    }

                    if( heapArr[cur] > heapArr[child]){
                        int tem = heapArr[cur];
                        heapArr[cur] = heapArr[child];
                        heapArr[child] = tem;
                        cur = child;
                    }else{
                        break;  // 怎么少了break呢,太大意
                    }
                }
            }


            public int peek(){
                    return heapArr[1];

            }

        }//end class heap
        
            heap myheap = new heap(k);
            for(int i=0; i<k; i++){
                myheap.add(nums[i]);
            }
            for(int i=k; i< nums.length; i++){
                if(nums[i] > myheap.peek()){
                    myheap.pop();
                    myheap.add(nums[i]);
                }
            }

            return myheap.peek();   


    }
}```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雄狮少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值