剑指offer-最小的k个数(数组)

题目描述

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

这道题需要注意的就是input.size()<k这个情况,

其他的思路就很简单,排序,输出

方法一:sort函数

由于用到了sort函数,因此时间复杂度是O(n*logn).

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector <int> res;
        if(input.size()<k)
            return res;
        sort(input.begin(),input.end());
        for(int i=0;i<k;i++)
            res.push_back(input[i]);
        return res;
    }
};

方法二:用排序算法(插入、交换、选择)

需要用到两个for循环,外层循环是k次。所以时间复杂度是O(n*k)

冒泡排序:冒泡排序一般是把大的一步步往后放,这里要反着把小的数往后放,然后把小的数放到res中

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector <int> res;
        int n=input.size();
        if(n<k)
            return res;
        int temp;
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<n-i-1;j++)
            {
                if(input[j]<input[j+1])
                {
                    temp=input[j];
                    input[j]=input[j+1];
                    input[j+1]=temp;
                }
            }
            res.push_back(input[n-i-1]);
        }
        return res;
    }
};

选择排序:选择排序把当前(第i次)最小的数下标记录在index中,然后将其与第i个交换。

        vector <int> res;
        int n=input.size();
        if(n<k)
            return res;        
   		for(int i=0;i<k;i++)
		{
		    int index=i;
			int temp=input[i];
			for(int j=i+1;j<n;j++)
			{
				if (input[index]>input[j])
					index=j;
			}
			input[i]=input[index];
			input[index]=temp;
			res.push_back(input[i]);
		}
		return res;

讨论区中还有用红黑树方法和堆排序的,时间复杂度更低。

猜你喜欢

转载自blog.csdn.net/Mr_xuexi/article/details/84566181
今日推荐