剑指Offer | 最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
排序,输出前k个
可以用到的排序有:快排、堆排序
代码
1. 快排
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> ans = new ArrayList<>();
if(input.length==0 || input.length<k) return ans;
sort(input, 0, input.length-1);
for(int i=0; i<k; i++) {
ans.add(input[i]);
}
return ans;
}
public void sort(int[] input, int low, int high) {
int i=low, j=high, k=input[low];
while(i<j) {
while(i<j && input[j]>k) j--;
if(i<j) {
int tmp = input[i];
input[i] = input[j];
input[j] = tmp;
i++;
}
while(i<j && input[i]<k) i++;
if(i<j) {
int tmp = input[i];
input[i] = input[j];
input[j] = tmp;
j--;
}
}
if(i>low) sort(input, low, i-1);
if(j<high) sort(input, j+1, high);
}
}
2. 堆排序
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
ArrayList<Integer> ans = new ArrayList<>();
if(input.length==0 || input.length<k) return ans;
for(int i=k/2-1; i>=0; i--) {
adjustHeap(input, i, k);
}
for(int i=k; i<input.length; i++) {
if(input[i]<input[0]) {
swap(input, 0, i);
adjustHeap(input, 0, k-1);
}
}
for(int i=k-1; i>=0; i--) {
ans.add(input[i]);
}
return ans;
}
public void adjustHeap(int[] arr, int i, int length) {
int tmp = arr[i];
for(int k=i*2+1; k<=length; k=k*2+1) {
if(k+1<length && arr[k]<arr[k+1]) {
k++;
}
if(arr[k]>tmp) {
arr[i] = arr[k];
i = k;
}
else break;
}
arr[i] = tmp;
}
public void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}