栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

突然刷到了当时面试ks的面试题,就小记一下吧

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

突然刷到了当时面试ks的面试题,就小记一下吧

这题其实理解了也就不难,就是在遍历所有元素的过程中高位池一个小根堆。每次遍历到一个新元素的时候,先判断队中元素个数是否小于k,若小于,则插入堆,否则就和堆顶元素比较。若大于堆顶元素,则先将堆顶元素pop,再插入新元素。

为了练习一下堆的写法,就不用stl的priority_que啦。

class Solution {
protected:
    void exchange(int &a, int &b){
        int t = a;
        a= b;
        b =t;
    }
public:
    
    void insert(vector &que, int num){
        que.push_back(num);
        int i = que.size()-1;
        while(i>0){
            int par = (i-1)>>1;
            if(que[par]<=que[i]){
                break;
            } 
            //交换
            exchange(que[par], que[i]);
            i=par;
        }
    }
    void erase(vector &que){
        exchange(que.back(), que[0]);
        que.pop_back();
        int n = (que.size()-1)>>1;
        
        int i = 0;
        while(i
            if(que[i]<=que[i*2+1]&&que[i]<=que[2*i+2]){
                break;
            }
            if(que[i*2+1]<=que[2*i+2]){
                exchange(que[i],que[i*2+1]);
                i = 2*i+1;
            }else{
                exchange(que[i],que[i*2+2]);
                i = 2*i+2;
            }
        }
    }
    int findKthLargest(vector& nums, int k) {
        vector que;
        for(int i=0;i
            if(que.size()
                insert(que, nums[i]);
            }else{
                int tmp = nums[i];
                if(que[0]
                    erase(que);
                    insert(que, nums[i]);
                }
            }
        }
        return que[0];
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号