forked from DreamCats/java-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathT40.java
More file actions
70 lines (62 loc) · 1.63 KB
/
Copy pathT40.java
File metadata and controls
70 lines (62 loc) · 1.63 KB
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
package books;
import java.util.Arrays;
/**
* @program JavaBooks
* @description: 最小的k个数
* @author: mf
* @create: 2019/09/23 14:22
*/
/*
输入n个整数,找出其中最小的k个数。例如,输入
4、5、1、6、2、7、3、8这个8个数字,则最小的
4个数字数1、2、3、4
*/
/*
思路:
partition操作
或者
最大堆
或者
红黑树
*/
public class T40 {
public static void main(String[] args) {
// partition
int[] arr = {4, 5, 1, 6, 2, 7, 3, 8};
int[] resArr = getLeastNumbers(arr, 4);
System.out.println(Arrays.toString(resArr));
}
// partition 可修改数组
private static int[] getLeastNumbers(int[] arr, int k) {
if (arr == null || k < 0) return null;
int index = partition(arr, 0, arr.length - 1);
while (index != k - 1) {
if (index > k -1) {
index = partition(arr, 0, index - 1);
} else {
index = partition(arr, index + 1, arr.length - 1);
}
}
int[] resArr = new int[k];
for (int i = 0; i < k; i++) {
resArr[i] = arr[i];
}
return resArr;
}
private static int partition(int[] arr, int left, int right) {
int pivot = left;
int index = pivot + 1;
for (int i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index++);
}
}
swap(arr, pivot, index - 1);
return index - 1;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}