牛客_最小的k个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/87915963

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路:

一、冒泡法的原理

由于是在寻找出n个数字中最小的k个数,可以采用冒泡法的原理,每次冒出一个最小值,将这个最小值添加到辅助输出数组中

或者是先调用Arrays的sort方法直接排序再选择输出。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result= new ArrayList<Integer>();
        //当输入数组为空,或者输入数组长度小于k的值返回为null
        if(input.length==0||k<=0||k>input.length){
            return result;
        }
        //因为只需要输入最小的K个数字就直接i<k
        for (int i=0;i<k;i++){
            {    //确保每次循环结束最右边都是最小值
                for(int j=0;j<input.length-i-1;j++){
                    //比较j的位置和j+1的位置,将小的值后移
                    if(input[j]<input[j+1]){
                        int temp = input[j];
                        input[j]=input[j+1];
                        input[j+1]=temp;
                    }
                }
                //此时将冒泡最小的数字已经在数组的最右边,将这个数字添加到最后输出的数组中
                result.add(input[input.length-i-1]);
            }
        }
        return result;
    }
}

二、Arrays的sort函数

使用Arrays的sort函数直接排序之后再选择输出

import java.util.Arrays;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result= new ArrayList<Integer>();
        //当输入数组为空,或者输入数组长度小于k的值返回为null
        if(input.length==0||k<=0||k>input.length){
            return result;
        }
        Arrays.sort(input);
        //因为只需要输入最小的K个数字就直接i<k
        for (int i=0;i<k;i++){
            {    
                result.add(input[i]);
            }
        }
        return result;
    }
}

三、使用TreeSet排序并去重元素

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> temp= new ArrayList<Integer>();
        ArrayList<Integer> result= new ArrayList<Integer>();
        //当输入数组为空,或者输入数组长度小于k的值返回为null
        if(input.length==0||k<=0||k>input.length){
            return result;
        }
        //利用TreeSet排序并去重元素
       TreeSet<Integer> set=new TreeSet<Integer>();
        for(int i:input){
            set.add(i);
            //为了适应海量数据去重,确保set中存储的只有k个,而且已经是有顺
            if(set.size()>k){
                set.remove(set.last());
            }
        }
        Iterator<Integer> iterator= set.iterator();
        while(iterator.hasNext()){
            int x=iterator.next();
            temp.add(x);
        }
        //因为只需要输入最小的K个数字就直接i<k
        for (int i=0;i<k;i++){
            {    
                result.add(temp.get(i));
            }
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/87915963