剑指offer40 最小的k个数

题目描述

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

1
2
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:

1
2
输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:

  • 0 <= k <= arr.length <= 10000
  • 0 <= arr[i] <= 10000

解题思路

方法一:排序

方法二:最小堆

方法三:快排

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class Solution40 {
// 排序 直接复制最小的K个数
public int[] getLeastNumbers(int[] arr, int k) {
if (k <= 0 || arr.length == 0) {
return new int[0];
}
int[] ans = new int[k];
Arrays.sort(arr);
// System.arraycopy(arr, 0, ans, 0, k);
for (int i = 0; i < k; i++) {
ans[i] = arr[i];
}
return ans;
}

// 堆排序
public int[] getLeastNumbers2(int[] arr, int k) {
if (k <= 0 || arr.length == 0) {
return new int[0];
}

// 最小堆 TODO 确认compare的作用
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
// 堆的大小为K
for (int i = 0; i < k; i++) {
queue.offer(arr[i]);
}
for (int i = k; i < arr.length; i++) {
if (arr[i] < queue.peek()) {
queue.poll();
queue.offer(arr[i]);
}
}
int[] ans = new int[k];
for (int i = 0; i < k; i++) {
ans[i] = queue.poll();
}
return ans;
}

// 快排思想
public int[] getLeastNumbers3(int[] arr, int k) {
if (k <= 0 || arr.length == 0 || k > arr.length) {
return new int[0];
}
quickSort(arr, 0, arr.length - 1, k - 1);
int[] ans = new int[k];
// System.arraycopy(arr, 0, ans, 0, k);
for (int i = 0; i < k; i++) {
ans[i] = arr[i];
}
return ans;
}


private void quickSort(int[] arr, int left, int right, int k) {
if (left >= right) {
return;
}
int index = quick(arr, left, right);
System.out.println(index);
if (k == index) {
return;
} else if (index < k) {
quickSort(arr, index + 1, right, k);
} else {
quickSort(arr, left, index - 1, k);
}
}

private int quick(int[] arr, int left, int right) {
int key = arr[left];
int indexLeft = left;
while (left < right) {
while (left < right && arr[right] >= key) {
right--;
}
while (left < right && arr[left] <= key) {
left++;
}
if (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
arr[indexLeft] = arr[left];
arr[left] = key;
return left;
}
}

资料

Author

John Doe

Posted on

2021-05-28

Updated on

2021-06-13

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.