题解 | #寻找第K大#

1.使用快速排序的分区方法,创造出一个数num, 使得num左边的数都小于等于num,num右边的数都大于等于num,获取到num在arr中的索引值mid
2.题意为求第k大的数,即求升序排序之后第n - k个数,所以将k赋值为n-k(如果分区方法是倒序排序的话,这一步可不进行)。
3.如果第一步获取到的索引值mid小于第二步中的k,那就将数组的左边界变为mid+1;
如果第一步获取到的索引值mid大于第二步中的k,那就将数组的右边界变为mid-1;
一直循环第一步和第三步,直到当mid等于k的时候,返回arr[mid]

代码如下

public int findKth(int[] a, int n, int k) {
       int left = 0;
       int right = n - 1;
       k = n - k;
       while (left <= right) {
           int mid = partition(a, left, right);
           if (k > mid) {
               left = mid + 1;
           }else if (k < mid) {
               right = mid - 1;
           }else {
               return a[mid];
           }
       }
       return -1;
   }


   private int partition(int[] arr, int left, int right) {
       // 定义主元
       // 小的指针
       int sp = left;
       // 大的指针
       int bigger = right;
       while (sp <= bigger) {
           if (arr[sp] <= arr[left]) {
               sp++;
           } else {
               swap(arr, sp, bigger);
               bigger--;
           }
       }
       swap(arr, left, bigger);
       return bigger;
   }

   public void swap(int[] arr, int a, int b) {
       int temp = arr[a];
       arr[a] = arr[b];
       arr[b] = temp;
   }
全部评论

相关推荐

驼瑞驰_招募评论官版...:这是要去亚马逊雨林守夜吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务