剑指 Offer 40. 最小的k个数C++

剑指 Offer 40. 最小的k个数C++

题目链接

剑指 Offer 40. 最小的k个数
在这里插入图片描述

思路分析

这是一道大厂常见题目,经常在面试中会遇到,下面介绍两种思路

思路1
可以直接使用sort方法,对数进行排序,然后把前k个数返回就可以

思路2
借助堆排序的思想,由于题目需要最小的K个数,因此我们可以先建立一个大小为K的大顶堆,然后将堆顶元素与未入堆的元素进行比较,如果该元素小于堆顶元素,则与之交换,重复此类过程,最终堆中数据就是最小的K个数

解题代码

class Solution {
public:
    void adjustDown(vector<int>& heap, int n, int root)
    {
        int parent = root;
        int child = (2 * parent) + 1;
        while(child < n)
        {
            if(child +1 < n && heap[child] < heap[child+1])
            {
                ++child;
            }
            if(heap[parent] < heap[child])
            {
                swap(heap[parent], heap[child]);
                parent = child;
                child = 2*parent +1;
            }
            else
            {
                break;
            }
        }
    }
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        
        vector<int>heap(k, 0);
        if(k == 0)
            return heap;
        //初始化数组
        for(int i = 0; i < k; ++i)
        {
            heap[i] = arr[i];
        }
        //初始化建堆
        for(int i = (k-1-1)/2; i >= 0; --i)
        {
            adjustDown(heap, k, i);
        }
        //删堆顶元素
        int size = arr.size();
        size -= k;
        while(size--)
        {
            if(arr[k] < heap[0])
            {
                swap(heap[0],arr[k]);
                adjustDown(heap, heap.size(), 0);
            }
            k++;
        }
        // for(int num : heap)
        // // {
        // //     cout << num << " ";
        // // }
        return heap;
    }
};

leetcode题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值