• 【算法】寻找第K大


    【算法】寻找第K大

    https://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf


    1.题目

    • 这道题最需注意的就是:找第K大的数,而不是第K小的数

    2.我的解法

    • 代码

      import java.util.*;
      
      /*
      快速排序,得出第K大的数
      注意是第K大,不是第K小
       */
      public class Solution {
      
          public static int findKth(int[] a, int n, int K) {
              quickSort(a, 0, n-1);
      
              return a[n-K];
          }
      
          public static void quickSort(int[] a, int begin, int end) {
              if (begin >= 0 && begin < a.length && end >= 0 && end < a.length && begin < end) {
                  int i = begin,j = end;
                  int axis = a[i];//中轴
      
                  while (i != j) {
                      while (i < j && axis < a[j])
                          j--;
                      if (i < j)
                          a[i++] = a[j];
      
                      while (i < j && axis > a[i])
                          i++;
                      if (i < j)
                          a[j--] = a[i];
      
                  }
      
                  a[i] = axis; //i==j
                  quickSort(a, begin, i - 1);
                  quickSort(a, i + 1, end);
              }
          }
      
      }
      

    不足

    • 不需要全部排序完成再找

    3.推荐解法

    • 代码

      利用二分的思想查找

      import java.util.*;
      
      /*
      每一轮快速排序(从大到小)后,判断中轴等于/小于/大于,下标K-1
      若等于,说明已经找到第K大,返回值
      中轴小于K-1,只要在右半部分继续找
      中轴大于K-1,只要在左半部分继续找
      
      注意:是第K大,不是第K小
      */
      public class Solution {
      
          public static int findKth(int[] a, int n, int K) {
              return findK(a,K,0,n-1);
          }
      
          public static int findK(int[] a,int K,int begin,int end) {
              if(begin<=end){
                  int index=quickSort(a, begin, end);
                  if(index==K-1)
                      return a[index];
                  else if(index<K-1)
                      return findK(a,K,index+1,end);
                  else
                      return findK(a,K,begin,index-1);
              }
              return -1;
          }
      
          public static int quickSort(int[] a, int begin, int end) {
              int i = begin,j = end;
              int axis = a[i];//中轴
      
              while (i < j) {
                  while (i < j && axis >= a[j])
                      j--;
                  if (i < j)
                      a[i++] = a[j];
      
                  while (i < j && axis <= a[i])
                      i++;
                  if (i < j)
                      a[j--] = a[i];
      
              }
      
              a[i] = axis; //i==j
              return i;
          }
      
      }
      
  • 相关阅读:
    Quartz快速入门 (转自 http://www.blogjava.net/baoyaer/articles/155645.html)
    C#HTML 转文本及HTML内容提取
    创建连接字符串方法
    源生js _AJax
    .NET里面附件上传大小限制的控制
    错误记录 COM
    Quartz的cron表达式
    Quartz 多任务调用
    Myeclipse的web工程和Eclipse互相转换
    Myeclipse8.0序列号生成程序
  • 原文地址:https://www.cnblogs.com/musecho/p/14525553.html
Copyright © 2020-2023  润新知