/*
* 输入n个整数,找出其中最小的K个数。
* 例如输入4,5,1,6,2,7,3,8这8个数字,
* 则最小的4个数字是1,2,3,4。
*/
import java.util.*;
public class GetLeastNumbers_Solution {
//算法1:时间复杂度O(nlogn)
public ArrayList<Integer> getLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
//输入不合法的情况
if(input.length == 0 || input == null || k > input.length || k == 0) {
return list;
}
Arrays.sort(input);
if(k == 1) {
list.add(input[0]);
return list;
}
for(int i = 0;i < k;i ++) {
list.add(input[i]);
}
return list;
}
/*算法二:Partition法,时间复杂度O(n)
* 首先将数组分成前k个数和后n-k个数两部分,定义一个指针在后n-k个数内移动,
* 当指针指向的数比前k个数的最大值小时,就将这个最大值替换为指针指向的数,直到指针走到头。
* 这样做的结果是:后面的数肯定都比前k个数的最大值大,因次前k个数就是最小的k个数
*/
public ArrayList<Integer> getLeastNumbers_Solution2(int [] input, int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(input.length == 0 || input == null || k > input.length || k == 0) {
return list;
}
for(int i = 0;i < k;i ++) {
list.add(input[i]);
}
for(int i = k;i < input.length;i ++) {
int index = getMaxIndex(list);
if(input[i] < list.get(index)) {
list.set(index, input[i]);
}
}
return list;
}
//获取list里最大值的下标
public int getMaxIndex(ArrayList<Integer> list) {
int init = list.get(0);
int index = 0;
for(int i = 1;i < list.size();i ++) {
if(list.get(i) > init) {
init = list.get(i);
index = i;
}
}
return index;
}
public static void main(String[] args) {
int[] input = {4,5,1,6,2,7,3,8};
int k = 9;
ArrayList<Integer> list = new GetLeastNumbers_Solution().getLeastNumbers_Solution(input, k);
for(int i : list) {
System.out.print(i + " ");
}
}
}
《剑指offer》-输入n个整数,找出其中最小的K个数。
最新推荐文章于 2020-10-24 11:33:37 发布