剑指Offer-数组-(6)

知识点/数据结构:数组

题目描述:
输入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;//必须设置一个全局变量
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值