29.最小的K个数

来源:互联网 发布:惠州综合网络问政平台 编辑:程序博客网 时间:2024/06/14 10:48

一、题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
二、解题思路
显然,这其实就是一道排序题,通常我们可以使用全排序,但是,这里要求找出最小的k个数,所以我们只找到最小的k个数即可
1、方法一:冒泡排序,时间复杂度O(n*k)
代码实现

/***冒泡排序,时间复杂度O(n*k)**/import java.util.ArrayList;public class Solution {    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        ArrayList<Integer> list = new ArrayList<Integer>();        if (input.length < k){            return list;        }        for (int i = 0; i< k; i++){            for (int j = i + 1;j < input.length; j++){                if (input[j] < input[i]){                    int temp = input[i];                    input[i] = input[j];                    input[j] = temp;                }            }        }        for (int i = 0; i < k; i++){            list.add(input[i]);        }        return list;    }}

2、方法二:快速排序,时间复杂度不好预测,最坏O(nlgn)
代码实现

/***partition思想,时间复杂度O(n),基于数组第K个数字进行调整,使得比第K个数字小的都在数组左边,比第K个数字大的都在数组右边,这样调整后,位于数组中左边的K个数字就是最小的K个数字。**/import java.util.ArrayList;public class Solution {    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        ArrayList<Integer> list = new ArrayList<Integer>();        if (input == null || input.length == 0 || k > input.length || k <= 0){            return list;        }        int low = 0;        int high = input.length - 1;        int index = partition(input,low,high);        while (index != k - 1){            if (index > k - 1){                high = index - 1;                index = partition(input,low,high);            } else {                low = index + 1;                index = partition(input,low,high);            }        }        for (int i = 0; i < k; i++){            list.add(input[i]);        }        return list;    }    int partition(int []arr, int low, int high){        int pivot = arr[low];        while (low < high){            while ((low < high) && (arr[high] >= pivot)){                high--;            }            arr[low] = arr[high];            while ((low < high) && (arr[low] <= pivot)){                low++;            }            arr[high] = arr[low];        }        arr[low] = pivot;        return low;    }}
0 0