• 第一道题两个有序的数组,如何找出两个数组合并后的第K大的数


    #include <cstdlib>
    #include <iostream>
    #include<algorithm>
    using namespace std;
    //28/05/13 16:36
    //如果使用临时数组的话复杂度会减少很多。。。
    //搞了两个小时终于搞定了
    
    //关键在于
    //1、如何判定那个指针移动
    //2、数组b遇到最后一个元素时怎么办
    
    //3、数组a遇到最后一个元素怎么办
    //4、设定a的最大值比b的最大值大,就是为了是q指针先打到末尾,要不然很混乱 
    int main(int argc, char *argv[])
    {
        
        //初始化数组 
        int a[]={1,2,3,4,8,9,13};
        int b[]={2,2,6,7,12};
        //计算数组长度 
        const int lena=sizeof(a)/sizeof(a[0]);
        const int lenb=sizeof(b)/sizeof(b[0]);
        //计算数组的最大值 
        const int maxa=a[lena-1];
        const int maxb=b[lenb-1];
        //pq指针分别指向数组的首元素 
        int *p=a;
        int *q=b;
        //设定计数器 ,使用静态值较好 
        static int count =0;
        //
        int k;
        cout<<"请输入第k大的k值:";
        cin>>k; 
        if(k<1||k>lena+lenb)
        {
                            cout<<"输入数据不符合要求,请重新输入,亲!"<<endl; 
                            cout<<"请输入第k大的k值:";
                            cin>>k; 
                             }
        
        //只考虑 当a数组最大元素大于b数组最大元素时 ,另外一种情况类推 
     if(maxa>maxb)   
     
     
     {
     //循环结束的条件 ,都已到达数组的结尾 
     while(p<=a+lena-1   &&   q<=b+lenb-1 )
        {
                  //a的元素小于b的元素时 
        if(*p<=*q)
        {
                  //先计数器加一 
                  ++count;
                  //如果满足k值输出此时a数组中的元素,跳出整个循环,不满足时语句不执行 
                  if(k==count)
                  {cout<<""<<k<<"个数是="<<*p<<endl; 
                   break;
                    }
                    //不是要找的元素时,往下走 
                  p++;
                  }
                  //&& p!=a+lena-1
     /*   if(*p<=*q && p==a+lena-1)
        {        ++count;
                  if(k==count)
                  {cout<<"第"<<k<<"个数是="<<*p<<endl; 
                   break;
                    }
                   }
      */
         
        
        //当a中元素大于b中元素时,q指针往后走,q不能是倒数第一个元素 
        if(*p>*q&& q!=b+lenb-1 )
        {
            ++count;
            if(k==count )   
            {cout<<""<<k<<"个数是="<<*q<<endl;
            break;
            }
            q++;
            }
            //&& q!=b+(sizeof(b)/sizeof(b[0]))-1
     
     //q是数组中的 最后一个元素,q指针不变,p指针往后走 
     //此时q已是b中的最后一个元素 
     //b+lenb是哨兵
     //b+lenb-1是最后一个元素 
       if(*p>*q && q==b+lenb-1)
        {        
                 //b中最后一个 元素命中时跳出 
                 ++count;
            if(k==count )   
            {cout<<""<<k<<"个数是="<<*q<<endl;
            break;
            }
        
            //没有命中,就要返回a中继续找 
            //当p不是A中的最后一个元素时,往下走 
            while(p<a+lena-1)
            {
                                 ++count;
            if(k==count )   
            {cout<<""<<k<<"个数是="<<*p<<endl;
            break;
            }
            p++;
            }
            //当p是a中最后一个元素时,指针不再往下走 
            if(p=a+lena-1) 
            {
                           ++count;
            if(k==count )   
            {cout<<""<<k<<"个数是="<<*p<<endl;
            break;
            }
                           }
            }
        
        
        
         }
    }      
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
  • 相关阅读:
    1004. Counting Leaves (30)
    51Nod 1272 最大距离 (栈或贪心)
    D
    M
    N
    F
    E
    L
    A. Office Keys ( Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) )
    K
  • 原文地址:https://www.cnblogs.com/fickleness/p/3103922.html
Copyright © 2020-2023  润新知