【剑指offer】最小的k个数

最小的K个数

https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf?f=discussion&toCommentId=5449680

class Solution {
public:
    void AdjustHeap(vector<int> &input, int i, int len){
        //i是指从第i个结点开始调整,len是指调整范围0-len
        int child = 2*i + 1;
        int temp = input[i];
        //递归调整法
        if(child < len){//当孩子节点还在调整范围内才可以调整,使用下沉调整
            //把大的数下沉
            if(child + 1 < len && input[child + 1] > input[child]){
                child = child + 1;
            }
            if(input[i] < input[child]){
                swap(input[i], input[child]);
                AdjustHeap(input, child, len);
            }
        }
    /*
    非递归的调整法
        while(child < len){//当孩子节点还在调整范围内才可以调整,使用下沉调整
            //把大的数下沉
            if(child + 1 < len && input[child + 1] > input[child]){
                child = child + 1;
            }
            if(temp >= input[child])
                break;
            input[i] = input[child];
            i = child;
            child = 2*i + 1;
        }
        input[i] = temp;
    */
    }
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        //用sort快排再选数太普通,再复习一遍堆排序,时间复杂度nlogn
        vector<int> res;
        if(input.empty() || k > input.size() || k == 0) return res;
        //建堆
        //算法的思想为维持一个大小为k的最大堆,再对k以后的元素进行遍历,如果有元素比堆顶的元素小的,则交换
        //并且继续调整维持最大堆,这样当遍历完所有元素之后,最大堆里的k个数就是原数组最小的k个数
        //该算法利用最大堆只是为了方便获取最大堆里的最大的元素,并不完全利用堆排序,另一种解法也可以利用堆排序排序完以后再取前k个数
        for(int i = (k - 1)/2; i >= 0; i--){
            AdjustHeap(input, i, k);
        }
        int i = k;
        while(i < input.size()){
            if(input[0] > input[i]){
                swap(input[0], input[i]);
                AdjustHeap(input, 0, k);
            }
            i++;
        }
      for(int i = 0; i < k; i++){
          res.push_back(input[i]);
      }
        return res;
    }
};
全部评论

相关推荐

Ryan188:我觉得你简历最核心的问题就是太大众化。 你要有一个认知就是,如果你是面试官,你是HR,其实他们每天都会收到非常多大量重复的像你这种简历。 就是说你的项目不是一个真实的上线的项目,可能是从网上学习而来的,或者是直接copy别人的项目,没有新意,没有展现出你自己对技术的思考,而且你的学历也不占优,自然而然就很难有人去选择你。 所以要做的实际上是差异化方向的工作,也就是“给我一个选择你的理由”,比如最近很火的ai,你可以写一个ai相关项目比如问答应用或者mcp编写或者agent搭建,需要你先花点时间学习,34天吧,展现你对这方面相较于其他人特有的思考; 或者写相关技术博客输出一些技术内容,有具体可以量化的成果等等去增加你的竞争力。 但以上这些都是后话,我去年在你这个时候也是没人理我,咱们双非学历也没实习,难找也正常,我当时整个3月份都没人鸟我,直到有个新招的岗位,很缺人很急,流程很快,所以我一下子进去了,所以运气方面也很重要,需要你一直坚持喝复盘,直到看到光明,加油兄弟
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务