topk

https://www.nowcoder.com/profile/601412/codeBookDetail?submissionId=8514010

1、全排序  时间复杂度O(nlogn)   *通过牛客*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public :
     vector< int > GetLeastNumbers_Solution(vector< int > input,  int k) {
         vector< int > res;
         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;
         
     }
};
2、Partiton思想 时间复杂度O(n)    *通过VS2013,牛客超时,很纳闷,欢迎找错*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
public :
     int Partition(vector< int >& input,  int begin,  int end)
     {
         int low=begin;
         int high=end;
         
         int pivot=input[low];
         while (low<high)
         {
             while (low<high&&pivot<=input[high])
                 high--;
             input[low]=input[high];
             while (low<high&&pivot>=input[low])
                 low++;
             input[high]=input[low];
         }
         input[low]=pivot;
         return low;
     }
     
     vector< int > GetLeastNumbers_Solution(vector< int > input,  int k) {
         
         int len=input.size();
         if (len==0||k>len)  return vector< int >();
         if (len==k)  return input;
         
         int start=0;
         int end=len-1;
         int index=Partition(input,start,end);
         while (index!=(k-1))
         {
             if (index>k-1)
             {
                 end=index-1;
                 index=Partition(input,start,end);
             }
             else
             {
                 start=index+1;
                 index=Partition(input,start,end);
             }
         }
         
         vector< int > res(input.begin(), input.begin() + k);
         
         return res;
     }
 
};
3、最大堆 时间复杂度O(nlogk)   *通过VS2013,牛客超时,很纳闷,欢迎找错*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public :
     vector< int > GetLeastNumbers_Solution(vector< int > input,  int k) {
         int len=input.size();
         if (len<=0||k>len)  return vector< int >();
         
         vector< int > res(input.begin(),input.begin()+k);
         //建堆
         make_heap(res.begin(),res.end());
         
         for ( int i=k;i<len;i++)
         {
             if (input[i]<res[0])
             {
                 //先pop,然后在容器中删除
                 pop_heap(res.begin(),res.end());
                 res.pop_back();
                 //先在容器中加入,再push
                 res.push_back(input[i]);
                 push_heap(res.begin(),res.end());
             }
         }
         //使其从小到大输出
         sort_heap(res.begin(),res.end());
         
         return res;
         
     }
};
4、红黑树:multiset集合  利用仿函数改变排序顺序 时间复杂度O(nlogk)  *通过牛客*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public :
     vector< int > GetLeastNumbers_Solution(vector< int > input,  int k) {
         int len=input.size();
         if (len<=0||k>len)  return vector< int >();
         
         //仿函数中的greater<T>模板,从大到小排序
         multiset< int , greater< int > > leastNums;
         vector< int >::iterator vec_it=input.begin();
         for (;vec_it!=input.end();vec_it++)
         {
             //将前k个元素插入集合
             if (leastNums.size()<k)
                 leastNums.insert(*vec_it);
             else
             {
                 //第一个元素是最大值
                 multiset< int , greater< int > >::iterator greatest_it=leastNums.begin();
                 //如果后续元素<第一个元素,删除第一个,加入当前元素
                 if (*vec_it<*(leastNums.begin()))
                 {
                     leastNums.erase(greatest_it);
                     leastNums.insert(*vec_it);
                 }
             }
         }
         
         return vector< int >(leastNums.begin(),leastNums.end());
     }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值