知识点/数据结构:数组
题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
我们可以先创建一个大小为k的数据容器来存储最小的k个数字,接下来每次从输入的n个整数中读取一个数。如果容器中已有的数字少于k个,则直接把这次读取的数字放入到容器中; 如果容器之已有k个数字了,此时我们不能再插入新的数字而只能是替换已经有的数字。找出已有的k个数字中的最大值,然后拿这次待插整数和最大值进行比较:如果待插入的值比当前已有的最大值小,则用这个数替换已有的最大值;如果待插入的值比当前最大值大,则这个待插入的数不可能是最小的k个值之一,于是我们可以抛弃这个数。
代码如下:
import java.util.ArrayList;//2018.11.21字节跳动面试准备中
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList <Integer> ();
if(k>input.length||k==0||input==null){
return list;
}
for(int i=0;i<k;i++){
list.add(input[i]);
}
for(int i=k;i<input.length;i++){
int j=this.getMax(list); //此处的this可以加可以不加 机上加强了代码的可读性!!!!
int com=(Integer)list.get(j); //此处的Integer加不加效果都是一样的。
if(input[i]<com){
list.set(j,input[i]);
}
}
return list;
}
public static int getMax(ArrayList<Integer> list){
int j=0;
int enjoy = list.get(0);//链表的节点的取得
for(int i=0;i<list.size();i++){ //链表的长度取得
if(enjoy<list.get(i)){
enjoy=list.get(i);
j=i;//2018.5.11.因为是取得索引符号更好存储!!!
}
}
return j;//必须设置一个全局变量
}
}