牛客: NC119 最小的K个数
题型: 215. 数组中的第K个最大元素 ( 基于快排的选择算法 )
topK 问题
- 大顶堆
- 基于快排的选择算法 ( 随机值优化时间复杂度 )
AC Code 基于快排的选择算法
import java.util.*;
public class Solution {
// 随机值
Random random = new Random();
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
int len = input.length;
// 基于快排的选择算法
ArrayList<Integer> list = new ArrayList<>();
if(k > len || k <= 0) return list;
int idx = quickSelect(input, 0, len - 1, k - 1);
for(int i = 0; i <= idx; i++) list.add(input[i]);
return list;
}
//
public int quickSelect(int[] arr, int left, int right, int kindex){
int idx = randomPartition(arr, left, right);
if(idx == kindex) return idx;
else return idx > kindex ? quickSelect(arr, left, idx - 1, kindex)
: quickSelect(arr, idx + 1, right, kindex);
}
public int randomPartition(int[] arr, int left, int right) {
// 生成随机值
int q = random.nextInt(right - left + 1) + left;
swap(arr, q, right);
return partition(arr, left, right);
}
public int partition(int[] arr, int left, int right){
// x 为随机值
int x = arr[right], i = left;
// 将小的放到左区间
for(int j = left; j < right; j++) {
if(arr[j] <= x) {
swap(arr, j, i);
i++;
}
}
swap(arr, i, right);
return i;
}
public void swap(int[] arr, int x, int y){
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
}