【算法】寻找第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; } }