剑指offer&&Leetcode 数据结构专题

最小的K个数

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

法1:每次选一个最小的数,然后和前面的交换,那么时间复杂度就是O(K*N)

代码:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
    {
        vector<int>ans;
        int len = input.size();
        if(k>len)  return ans;
        for(int i=0;iint index_x = i;
            int index_y = i;
            for(int j=i+1;jif(input[j]for(int i=0;ireturn ans;
    }
};

法2:使用红黑树,红黑树的插入,查找,删除复杂度均是O(logk)。所以维护一个K个大小的红黑树,然后每次插入一个值的时候,和最大的值进行比较,如果比最大的小,那么删除最大的,插入这个值,那么时间复杂度为O(nlogk),mutliset和set都是基于红黑树实现的,因为可能有重复的,所以使用multiset。

代码:

#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
    multiset<int,greater<int> > mset;
    mset.clear();
    vector<int>ans;
    int size = input.size();
    for (int i = 0; i < size; i++)
    {
        if (mset.size() < k) mset.insert(input[i]);
        else
        {
            multiset<int, greater<int> >::iterator iter = mset.begin();
            if (input[i]< *iter)
            {
                mset.erase(iter);
                mset.insert(input[i]);
            }
        }
    }
    multiset<int, greater<int> >::iterator iter = mset.begin();
    while (iter != mset.end())
    {
        ans.push_back(*iter);
        ++iter;
    }
    reverse(ans.begin(), ans.end());
    return ans;
}



int main()
{
    vector<int>ans;
    initializer_list<int>lst = { 4, 5, 1, 6, 2, 7, 3, 8 };
    vector<int>vec(lst);
    ans = GetLeastNumbers_Solution(vec, 5);
    vector<int>::iterator iter = ans.begin();
    while (iter != ans.end())
    {
        cout << *iter << " ";
        ++iter;
    }
    cout << endl;
    //cout << MoreThanHalfNum_Solution(numbers) << endl;
    return 0;
}

你可能感兴趣的:(Leetcode,剑指offer)