剑指Offer(牛客版)--面试题40: 最小的K个数

剑指Offer(牛客版)--面试题40: 最小的K个数_第1张图片

题目描述:

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.

 

分析:

剑指Offer(牛客版)--面试题40: 最小的K个数_第2张图片

 完整代码:

class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        //声明一个容器,用来存放最小k个数字
        vector array;
        //清空 array
        array.clear();
        //检查输入的合法性
        if(input.size() < k || k < 1)
            return array;
        //声明一个迭代器,智能读取容器中的元素,不能修改
        vector::const_iterator iter  = input.begin();
        //使用 intset 声明一个容器
        intset result;
        //遍历整个容器
        for(; iter != input.end(); ++iter)
        {
            //如果 array 容器没有装满 
            if((result.size()) < k)
                result.insert(*iter);
            //如果容器已经装满
            else
            {
                //声明一个迭代器
                setIterator it = result.begin();
                //判断当前的元素是否大于array中的第一个元素
                if(*iter < *(result.begin()))
                {
                    //删去array的第一个元素
                    result.erase(*it);
                    //将当前的元素插入到 array 中
                    result.insert(*iter);
                }
            }
        }
        //重新排序
        for(setIterator point = result.begin(); point != result.end(); ++point)
        {
            array.push_back(*point);
        }
        //返回最终的结果
        return array;
    }
private:
    typedef multiset > intset;
    typedef multiset >:: iterator setIterator;
};

相关知识点:

1、迭代器:

https://www.cnblogs.com/yc_sunniwell/archive/2010/06/25/1764934.html

2、set 和 multiset:

https://blog.csdn.net/xiajun07061225/article/details/7459206

你可能感兴趣的:(剑指Offer(牛客版))