剑指offer:最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
//用partition的时间复杂度是O(n)
//用set的时间复杂度是0(n*lgk),但是适合海量数据
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
       vector<int> out;
       int size = input.size();
       if(size == 0 || size < k||k < 1) 
         return out;
       
       int start = 0;
       int end = size - 1;
         
       int index =  partition(input, start, end);
       while(index != k-1)
       {
          if(index < k-1)
          {
             start = index + 1;
             index =  partition(input, start, end);
          }
          else if(index > k-1)
          {
             end = index - 1;
             index =  partition(input, start, end);
          }
       }
       out.insert(out.begin(),input.begin(),input.begin()+k);
       return out; 
    }
    
    //快排中的partition函数
    int partition(vector<int> &numbers,int start, int end)
    {
        if(start == end)
            return start;
         
        int temp = numbers[end];
         
        //跳出迭代的时候start = end
        while(start < end)
        {
          while(start < end && numbers[start] < temp)
            ++start;
          numbers[end] = numbers[start];
               
          while(start < end && numbers[end] >= temp)
            --end;
          numbers[start] = numbers[end];
        }
         
        numbers[end] = temp;
        return end;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值