剑指Offer—29—最小的 K 个数

来源:互联网 发布:python xgboost 编辑:程序博客网 时间:2024/05/21 11:18

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

package A29最小的K个数;import java.util.ArrayList;import java.util.List;public class Solution {    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        ArrayList<Integer> list = new ArrayList<>();        if (k > input.length) {            return list;        }         //1. 冒泡排序,每轮选出一个最小的加入到List,外层循环K次即可,时间复杂度O(n*K)        for (int i = 0; i < k; i++){            for (int j = input.length-1; j > i ; j--) {                if (input[i] > input[j]){                    int temp = input[i];                    input[i] = input[j];                    input[j] = temp;                }            }            list.add(input[i]);        }        return list;    }    public static void main(String[] args) {        Solution solution = new Solution();        int[] input = {6,3,9,3,6,12,1,0};        List<Integer> list = solution.GetLeastNumbers_Solution(input,3);        for (int i : list) {            System.out.println(i);        }    }}
package A29最小的K个数;import java.util.ArrayList;import java.util.List;public class Solution2 {    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        // 基于快排的思想,每一次划分都会有一个数字位于最终位置        ArrayList<Integer> list = new ArrayList<>();        if (k > input.length) {            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;            }else {                low = index + 1;            }            index = partition(input,low,high);        }        for (int i = 0; i < k; i++) {            list.add(input[i]);        }        return list;    }    // 返回start位置的数最终的索引    public int partition(int[] input,int start,int end){        int temp = input[start];        while (start < end){            while( temp <= input[end] && start < end){                end--;            }            input[start] = input[end];            while (temp >= input[start] && start < end){                start++;            }            input[end] = input[start];        }        input[start] = temp;        return start;    }    public static void main(String[] args) {        Solution2 solution2 = new Solution2();        int[] temp = {4,7,1,3,9,7};        //solution2.partition(temp,0,5);        List<Integer> list = solution2.GetLeastNumbers_Solution(temp,3);        for (int i : list) {            System.out.println(i);        }    }}