public ArrayList<Integer> GetLeastNumbers_Solution2(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || input.length == 0 || k > input.length || k <= 0) {
return res;
}
//对数组排序
Arrays.sort(input);
//取前k个数for (int i = 0; i < k; i++) {
res.add(input[i]);
}
return res;
}
方法2:
public ArrayList<Integer> GetLeastNumbers_Solution3(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || input.length == 0 || k > input.length || k <= 0) {
return res;
}
//冒泡排序:只找出来前k个数即可for (int i = 0; i < k; i++) {
for (int j = input.length - 2; j >= i; j--) {
if (input[j] > input[j + 1]) {
int temp = input[j];
input[j] = input[j + 1];
input[j + 1] = temp;
}
}
}
for (int i = 0; i < k; i++) {
res.add(input[i]);
}
return res;
}
方法3:
public ArrayList<Integer> GetLeastNumbers_Solution1(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || input.length == 0 || k > input.length || k <= 0) {
return res;
}
//创建大根堆的方式1:通过传入Collections.reverseOrder()//PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, Collections.reverseOrder());//创建大根堆的方式2:传入自定义的类对象(该类继承Comparator接口,重写compare方法,实现了从大到小排序)
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, new MaxHeapComparator());
//先填满这个大根堆for (int i = 0; i < k; i++) {
maxHeap.add(input[i]);
}
for (int i = k; i < input.length; i++) {
//如果元素小于最大堆的堆顶元素(这k个值中的最大值),那么弹堆,将该元素进堆if (input[i] < maxHeap.peek()) {
maxHeap.poll();
maxHeap.add(input[i]);
}
}
//将堆中元素装入list// res.addAll(maxHeap);for (Integer num : maxHeap) {
res.add(num);
}
return res;
}
publicclassMaxHeapComparatorimplementsComparator<Integer> {//compare方法,返回-1时,排列顺序为o1,o2;返回1时,排列顺序为o2,o1publicint compare(Integer o1, Integer o2) {
/*
if (o1 > o2) {
return -1;
}else {
return 1;
}
*/return o2.compareTo(o1);
}
}
方法四:
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if (input == null || input.length == 0 || k > input.length || k <= 0) {
return res;
}
//利用partition过程使pivot停在 k-1处,那么【0~k-1】便是最小的K个数int begin = 0;
int end = input.length - 1;
int pIndex = partition(input, begin, end);
while (pIndex != k - 1 ) {
if (pIndex > k - 1 ) {
end = pIndex - 1;
pIndex = partition(input, begin, end);
}
if (pIndex < k - 1) {
begin = pIndex + 1;
pIndex = partition(input, begin, end);
}
}
for (int i = 0; i < k; i++) {
res.add(input[i]);
}
return res;
}
publicintpartition(int[] arr, int begin, int end) {
int pivot = arr[begin];
int i = begin + 1;
int j = end;
while (true) {
while (i <= end && arr[i] < pivot) {
i++;
}
while (j >= begin + 1 && arr[j] > pivot) {
j--;
}
if (i < j && i <= end && j >= begin + 1 ) {
swap(arr,i,j);
i++;
j--;
}else {
break;
}
}
swap(arr,begin,j);
return j;
}
publicvoidswap(int[] arr, int i ,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}