LeetCode215问题

来源:2-9 作业:Select K 问题

要快乐_

2021-04-06 11:44:44

public class SelectK {

public static  <E extends Comparable<E>> Object selectK(E[] arr,int k){
Random random = new Random();
return selectK(arr,arr.length-k,0,arr.length-1,random);
}

private static <E extends Comparable<E>> Object selectK(E[] arr, int k, int l, int r, Random random){
if (l>r) return -1;
int p = partition(arr,l,r,random);
if (arr[p].compareTo(arr[k])==0)return arr[p];
if (arr[p].compareTo(arr[k])<0)
return selectK(arr,k,p+1,r,random);
return selectK(arr,k,l,p-1,random);
}

private static <E extends Comparable<E>> int partition(E[] arr, int l, int r, Random random) {
int p = l+random.nextInt(r-l+1);
swap(arr,l,p);
int i = l + 1 , j = r ;
while (true){
while (i <= j&&arr[i].compareTo(arr[l]) < 0)
i++;

while (j >=i &&arr[j].compareTo(arr[l]) > 0)
j--;

if (i>=j)break;

swap(arr,i,j);
i++;
j--;
}
swap(arr,l,j);

return j;
}

private static <E extends Comparable<E>> void swap(E[] arr, int l, int p) {
E temp = arr[l];
arr[l] = arr[p];
arr[p] = temp;
}

public static void main(String[] args) {
Integer[] arr = new Integer[]{3,3,3,3,4,3,3,3,3};
for (int i = 0; i < 100; i++) {
System.out.print(selectK(arr,1)+" ");

}
}

}

老师你好,跑这个Main有时候会出现4 有时候会出现3 检查了好几遍了还没找到错误

写回答

1回答

liuyubobobo

2021-04-06

在 partition 中不是 arr[k] 和 arr[p] 作比较,而是 k 和 p 作比较。


基于你的代码,应该是这样的:

if (l>r) return -1;

int p = partition(arr,l,r,random);

if (p == k) return arr[p];

if (k > p) return selectK(arr,k,p+1,r,random);

return selectK(arr,k,l,p-1,random);


​课程的参考代码:https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/12-More-about-QuickSort/10-Select-K/src/Solution.java


继续加油!:)

0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2610 学习 · 1087 问题

查看课程