0
点赞
收藏
分享

微信扫一扫

剑指Offer 最小的K个数

Ichjns 2023-01-21 阅读 46


题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

1.利用Java的优先队列PriorityQueue(小顶堆)

import java.util.ArrayList;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] arr, int k) {
if(k > arr.length) {
return new ArrayList<Integer>();
}
ArrayList<Integer> list = new ArrayList<Integer>();
PriorityQueue<Integer> queue = new PriorityQueue<>();
for(int i = 0; i < arr.length; i++) {
queue.offer(arr[i]);
}
for(int i = 0; i < k; i++) {
list.add(queue.poll());
}
return list;
}
}

2.快排变形

import java.util.ArrayList;

public class Solution {

private static int partition(int[] arr, int low, int high) {
//确定边界值
int pivot = arr[low];
while (low < high) {
//从右往左找,找到第一个小于边界值的数
while (low < high && arr[high] >= pivot) {
//大于区左移
high--;
}
//赋值给小于区的数给小于区的最后一个数
arr[low] = arr[high];
//左往右找,找到一个大于边界值的数
while (low < high && arr[low] <= pivot) {
//小于区右移
low++;
}
//将该值赋给大于区的第一个数
arr[high] = arr[low];
}
//将边界值放回
arr[low] = pivot;
return low;
}


public static ArrayList<Integer> GetLeastNumbers_Solution(int [] arr, int k) {=
if (arr == null || arr.length == 0 ||arr.length < k || k == 0) {
return new ArrayList<>();
}
int low = 0;
int high = arr.length - 1;
int pos = partition(arr, low, high);
while (low < high&&pos!=k-1) {
pos = partition(arr, low, high);
if (pos < k - 1) {
low = pos + 1;
} else {
high = pos - 1;
}
}
ArrayList<Integer> list = new ArrayList<>();
for(int i =0;i<k;i++){
list.add(arr[i]);
}
return list;
}
}

3.自己构建小根堆:

import java.util.ArrayList;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] arr, int k) {
if (arr.length < k || k == 0) {
return new ArrayList<>();
}
for(int i = arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
ArrayList<Integer>list = new ArrayList<Integer>(k);
for(int j = arr.length-1;j>=arr.length-k;j--){
swap(arr,0,j);
list.add(arr[j]);
adjustHeap(arr,0,j);
}
return list;
}
public void swap(int[] arr , int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void adjustHeap(int [] arr,int index,int heapSize){
int temp = arr[index];
for(int k = index*2+1;k<heapSize;k = k*2+1){
if(k+1<heapSize&&arr[k]>arr[k+1]){
k++;
}
if(arr[k]<temp){
arr[index] = arr[k];
index = k;
}else{
break;
}
}
arr[index] = temp;
}


}


举报

相关推荐

0 条评论