题目:找出无序数组中第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)会存在一个退出的问题。这个可以上网百度一下就行。
时间: 2024-10-26 15:45:57