版权声明:本博客可任意转载,不用通知 https://blog.csdn.net/hbkzhu13579/article/details/84143495
链接
牛客:最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
我们需要借助一个辅助的函数,就是快排当中的分割(Partition),我们只要找到第k个数,就根据partition找到了对应的k个最小的数。
还有一种方法是建立一个k大小的最大堆 具体参考这篇文章:
寻找数组中最小的k个数(快排和堆排)
代码
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> a = new ArrayList<Integer>();
int length = input.length;
if(k > length)
return a;
if(k == length){
for(int i = 0; i < k; i++){
a.add(input[i]);
}
return a;
}
int low = 0;
int high = length - 1;
int pivot = Partition(input, low, high);
while(pivot!=k){
if(pivot<k){
low = pivot + 1;
pivot = Partition(input, low, high);
}
else{
high = pivot - 1;
pivot = Partition(input, low, high);
}
}
for(int i = 0; i < k; i++){
a.add(input[i]);
}
return a;
}
int Partition(int r[], int i, int j)
{
int pivot = r[i]; //选择第一个作为枢纽元
while (i<j)
{
while (i < j && r[j] >= pivot) //从后面找第一个小于temp的元素 放到i位置
j--;
if (i < j)
r[i++] = r[j];
while (i < j &&r[i] <= pivot) //从前面找第一个大于temp的元素 放到high位置
i++;
if (i < j)
r[j--] = r[i];
}
r[i] = pivot; //枢纽元放到i位置
return i;
}
}