《剑指offer》面试题30——最小的k 个数

《剑指offer》面试题30——最小的k 个数

1.题目描述:

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

2.解题思路:

1。全排序。时间复杂度O(nlogn)。
2。Partiton思想 ——用快速排序,时间复杂度O(n) 。
3。最大堆 时间复杂度O(nlogk)
4。红黑树:multiset集合。

3.代码实现:

3.1.方法1代码

#include<algorithm>
#include<iostream>
#include <vector>

using namespace std;

    vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
    {
            vector<int> res;
            res.clear();
            if(input.empty()||k>input.size())
                return res;
            sort( input.begin(), input.end());
            for(int i=0; i<k; i++)
                res.push_back(input[i]);

            return res;

    }

void Print1Dvec(vector<int> myarray)
{
    if(myarray.size()==0)
        cout<<"vector为空"<<endl;
    int num=myarray.size();
    for(int i=0; i<num;i++)
         cout<<myarray[i]<<"  ";
    cout<<endl;
}

int main()
{
    vector<int>vec={1,5,1,1,1,7,1,8};
    Print1Dvec(vec);
    vector<int>vec2=GetLeastNumbers_Solution(vec  ,4);
    Print1Dvec(vec2);

       return 0;
}

运行结果:

1  5  1  1  1  7  1  8
1  1  1  1

Process returned 0 (0x0)   execution time : 0.429 s
Press any key to continue

方案4代码:


//multiset
//当容器中的元素数量不够k 个时,直接放入容器中
//当容器中的元素数量满k个时,,把当前数组中的元素与容器中的最大的元素比较。
//如果当前元素值小于容器中的最大值,则将容器中的最大值替换为当前值。

#include<iostream>
#include <vector>
#include<set>

using namespace std;

//typedef multiset<int, greater<int>>  intSet;
//typedef multiset<int, greater<int>>::iterator setiter;


    vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
    {
        multiset<int, greater<int>>  LeastNumber ;
        if(input.size()<=0||k>input.size())
            return vector<int> ();

        //仿函数中的greater<T>模板,从大到小排序
        vector<int>::iterator itervec=input.begin();
        for(; itervec!=input.end();  itervec++ )
        {
            if(LeastNumber.size()<k)                      //当容器中的元素数量不够k 个时,直接放入容器中
                LeastNumber.insert(*itervec);
            else                                                         //当容器中的元素数量满k个时,,把当前数组中的元素与容器中的最大的元素比较。
            {
                multiset<int, greater<int>>::iterator  Itergreast=LeastNumber.begin();
                if(*itervec<*Itergreast)
                {
                    LeastNumber.erase( Itergreast);   //删除迭代器指针指向的元素
                    LeastNumber.insert(*itervec);   //插入元素值
                }
            }
        }
            return vector<int>(LeastNumber.begin(),LeastNumber.end());

    }

void Print1Dvec(vector<int> myarray)
{
    if(myarray.size()==0)
        cout<<"vector为空"<<endl;
    int num=myarray.size();
    for(int i=0; i<num;i++)
         cout<<myarray[i]<<"  ";
    cout<<endl;
}

int main()
{
    vector<int>vec={1,5,1,1,1,7,1,8};
    Print1Dvec(vec);
    vector<int>vec2=GetLeastNumbers_Solution(vec  ,4);
    Print1Dvec(vec2);

       return 0;
}

运行结果:

1  5  1  1  1  7  1  8
1  1  1  1 

Process returned 0 (0x0)   execution time : 0.446 s
Press any key to continue.

猜你喜欢

转载自blog.csdn.net/zhenaoxi1077/article/details/80462565