方法一:大顶堆
时间复杂度:O(nlongk), 插入容量为k的大根堆时间复杂度为O(longk), 一共遍历n个元素
空间复杂度:O(k)
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || input.length < k || k <= 0) return res;
//降序,最大的数在堆顶(这里牛客网要莫名报错,但可以运行)
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((Integer a, Integer b) -> b - a);
/*PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer a, Integer b) {
return b - a;
}
});*/
for (int val : input) {
if (pq.size() < k) pq.offer(val);
else if (pq.peek() > val) {
pq.poll(); //!!!注意这里要用 poll()
pq.offer(val);
}
}
while (!pq.isEmpty()) res.add(pq.poll());
return res;
}
}方法二:快排(推荐)
时间复杂度:O(n)
空间复杂度:O(1)
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || k <= 0 || input.length < k) return res;
quickSort(input, 0, input.length - 1);
for (int i = 0; i < k; i++) {
res.add(input[i]);
}
return res;
}
public void quickSort(int[] input, int left, int right) {
if (left > right) return;
int i = left;
int j = right;
int tmp = input[left];
while (i < j) {
while (i < j && input[j] >= tmp) j--;
while (i < j && input[i] <= tmp) i++;
if (i < j) {
int t = input[i];
input[i] = input[j];
input[j] = t;
}
}
input[left] = input[i];
input[i] = tmp;
quickSort(input, left, i - 1);
quickSort(input, i + 1, right);
}
}

京公网安备 11010502036488号