zoukankan      html  css  js  c++  java
  • 无序数组中第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)会存在一个退出的问题。这个可以上网百度一下就行。

  • 相关阅读:
    Jenkins历史构建作业jobs的删除与管理
    Redis消息队列与主流的消息队列中间件对比
    GDAL数据模型
    Android的语言切换
    GDAL驱动实现向导
    Win7 安装IIS
    局域网中其他机器不能访问本机IIS网站
    DXF库(dxflib)使用指南
    GDAL中文学习资料
    QT的中文站址
  • 原文地址:https://www.cnblogs.com/love-yh/p/7436796.html
Copyright © 2011-2022 走看看