剑指offer之二十三---最小的K个数

来源:互联网 发布:淘宝关于产品瑕疵说明 编辑:程序博客网 时间:2024/05/16 05:00

题目描述

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

public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input , int k){/** * 首先拿到这个题的想法是:先排序,然后把前k个数放入list中 */ArrayList<Integer> list = new ArrayList<Integer>();if(input == null || input.length == 0)return list;if(k == 0)return list;if(k > input.length)return list;Arrays.sort(input);for(int i = 0; i < k; i++)list.add(input[i]);return list;}

深入:Arrays.sort()底层采用快排和优化的归并排序,当待排序的数组是基本数据类型时,采用快速排序,当待排序的数组是对象类型时,采用优化的归并排序。因而该排序方法使用了设计模式中的策略模式。

看看牛油的做法:

冒泡排序的思想,只不过最外层循环K次就可以了,也就是说不用全部排序,只挑出符合提议的K个就可以。

链接:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf来源:牛客网public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        ArrayList<Integer> al = new ArrayList<Integer>();        if (k > input.length) {            return al;        }        for (int i = 0; i < k; i++) {            for (int j = 0; j < input.length - i - 1; j++) {                if (input[j] < input[j + 1]) {                    int temp = input[j];                    input[j] = input[j + 1];                    input[j + 1] = temp;                }            }            al.add(input[input.length - i - 1]);        }        return al;    }

/*
*基于堆排序算法,构建最大堆。时间复杂度为O(nlogk)
*如果用快速排序,时间复杂度为O(nlogn);
*如果用冒泡排序,时间复杂度为O(n*k)
*/


原创粉丝点击