寻找第K大(NC88/考察次数Top7/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找第K大(NC88/考察次数Top7/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

示例1
输入:
[1,3,5,2,2],5,3
返回值:
2
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here
        //思路1,进行库函数sort排序后进行求解
        vector<int> tmp = a;
        sort(tmp.begin(), tmp.end());                  //使用库函数sort排序
        int res = tmp[n-1];
        for(int i = n-1; i>0; --i)                     //遍历找值,找到第K大值
        {
            if(tmp[i]>tmp[i-1])
            {
                if(K == 1)
                {
                    return tmp[i];
                }
                K--;
            }
        }
        return res;
      
//        //思路2,使用快速排序二分查找来处理,利用快速排序的特点(找出某值的合适
          //位置,左边所有的值比他都小,右边的值比他都大)
//         quicksort(a, 0, n-1, K);                    //自定义quicksort函数
//         int res = a[n-1];
//         for(int i = n-1; i>0; --i)
//         {
//             if(a[i]>a[i-1])
//             {
//                 if(K == 1)
//                 {
//                     return a[i];
//                 }
//                 K--;
//             }
//         }
//         return res;

//     //定义quicksort函数(此处为前面排序算法中有讲解的快速排序法)
//     void quicksort(vector<int>&a, int left, int right, int K){
//         if(left>=right)
//             return;
//         int i = left;
//         int j = right;
//         int val = a[i];
//         while(i<j)
//         {
//             while(i<j && a[j]>=val)
//                 j--;
//             a[i] = a[j];
//             while(i<j && a[i]>=val)
//                 i++;
//             a[j] = a[i];
//         }
//         a[i] = val;
//         quicksort(a, left, i-1, K);
//         quicksort(a, i+1, right, K);
//     }
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于寻找第K大(NC88/考察次数Top7/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

最小的K个数(NC119/考察次数Top5/难度中等)

链表中的节点每K个一组翻转(NC50/考察次数Top12/难度中等)

设计LRU缓存结构(NC93/考察次数Top3/难度中等)

删除链表的倒数第n个节点(NC53/考察次数Top19/难度中等)

二分查找-II(NC105/考察次数Top66/难度中等)

二分查找-II(NC105/考察次数Top66/难度中等)