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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/82668882

最小的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;i<k;i++)
        {  
            int index_x = i;
            int index_y = i;
            for(int j=i+1;j<len;j++)
                if(input[j]<input[index_y])  index_y = j;
            swap(input[index_x],input[index_y]);
        }
        for(int i=0;i<k;i++)  ans.push_back(input[i]);
        return ans;
    }
};

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

代码:

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<algorithm>
#include<functional>
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;
}

猜你喜欢

转载自blog.csdn.net/u014303647/article/details/82668882