劍指Offer之最小的k個數

題目描述

  輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。java

基本思路

  使用Partition的思想來解決問題。若是基於數組的第k個數字來調整,使得比第k個數字小的全部數字都位於數組的左邊,比第k個數字大的全部數字都位於數組的右邊。這樣調整後,位於數組中左邊的k個數字就是最小的k個數字(這k個數字不必定是排序的)。此方法是$O(n)$的算法,只有當咱們能夠修改輸入的數組時使用。算法

Java代碼

 

package com.swordOffer.kLeastNumbers21; import java.util.ArrayList; import java.util.Scanner; /** * Created by Feng on 2017/5/23. * 輸入n個整數,找出其中最小的K個數。 * 例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 * * O(n)的算法,只有當咱們能夠修改輸入的數組時可使用 */
public class KLeastNumbers { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt();//數組大小
            int k = sc.nextInt();//k的值
            int[] input = new int[n]; for (int i = 0; i < n; i++) { input[i] = sc.nextInt(); } ArrayList<Integer> result = getLeastNumbers(input, k); for (Integer i : result) { System.out.print(i + "\t"); } } } public static ArrayList<Integer> getLeastNumbers(int[] input, int k) { //存放最小的k個值
        ArrayList<Integer> list = new ArrayList<>(); //若是數組的大小小於k則返回list
        if (input.length < k) { return list; } findKMin(input, 0, input.length - 1, k); for (int i = 0; i < k; i++) { list.add(input[i]); } return list; } /** * 尋找k個最小的數 * * @param input * @param begin * @param end * @param k */
    private static void findKMin(int[] input, int begin, int end, int k) { if (begin < end) { int index = partition(input, begin, end); if (index == k - 1) { return; } else if (index < k - 1) { findKMin(input, index + 1, end, k); } else { findKMin(input, begin, index - 1, k); } } } /** * 利用分治的思想將比第k個數字小的數字移到左邊,比第k個大的移到右邊 * * @param input * @param begin * @param end * @return
     */
    private static int partition(int[] input, int begin, int end) { //設立標兵
        int pivot = input[begin]; while (begin < end) { //從後往前找到比pivot小的就中止
            while (begin < end && input[end] >= pivot) { end--; } input[begin] = input[end]; //從前日後找到比pivot大的就中止
            while (begin < end && input[begin] <= pivot) { begin++; } input[end] = input[begin]; } input[begin] = pivot; return begin; } }
相關文章
相關標籤/搜索