无序数组中第Kth大的数

题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45。

输入:

第一行输入无序数组,第二行输入K值。

该是内推滴滴打车时(2017.8.26)的第二题,也是《剑指offer》上最小k个数的变形。当时一看到题,这个不是用快排吗?然后就写了,结果始终没有通过,遗憾的超时提交了。错误点主要在于,这里求的是第K大的数,而若是我们使用K去判断快排得到的下标,得到的是第K个数(等同于排序以后从左往右下标为K-1),而题中隐藏的意思等同于排序以后从 右往左数第K个数。所写在写代码的时候要注意一个K值得转换。

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int patiton(vector<int> &ivec,int left,int right);
 8 int main()
 9 {
10     vector<int> ivec;
11     int x;
12     while(cin>>x)
13     {
14         ivec.push_back(x);
15     }
16     int K;
17     cin>>K;
18 
19     int left=0,right=ivec.size()-1;
20     int index=patiton(ivec,left,right);
21     K=ivec.size()-K;        //注意这行
22     while(index !=K)
23     {
24         if(index<K)
25             left=index+1;
26         else
27             right=index-1;   
28         index=patiton(ivec,left,right);
29     }
30     cout<<ivec[K];
31     return 0;
32 }
33 
34 int patiton(vector<int> &ivec,int left,int right)
35 {
36     int i=left-1;
37     
38     int pivot=ivec[right];
39     for(int j=left;j<right;j++)
40     {
41         if(ivec[j]<=pivot)
42         {
43             i++;
44             swap(ivec[i],ivec[j]);
45         }
46     }
47     swap(ivec[i+1],ivec[right]);
48     return i+1;
49 }

注意:在本地IDE编译的时候,while(cin>>x)会存在一个退出的问题。这个可以上网百度一下就行。

原文地址:https://www.cnblogs.com/love-yh/p/7436796.html