29最小的K个数

Posted 张乐乐章

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了29最小的K个数相关的知识,希望对你有一定的参考价值。

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
 
思路:
利用快速排序的partion 来解决

如果基于数字的第k个数字来调整,使得比第k个数字小的数字都位于数组的左边,比k个数字大的所有数字都位于数组右边。这样 调整之后,位于数组中左边的k个数字就行最小的k个数字(这k个不一定有序)。
 
 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
 4         ArrayList<Integer> res = new ArrayList<Integer>();
 5            if(k>=input.length||k==0){
 6             if(k==input.length){
 7                 for(int m=0;m<k;m++)
 8                 res.add(input[m]);
 9             }
10         return res;
11         }
12         
13         
14         int start =0;
15         int end = input.length-1;
16         
17         int j = partion(input,start,end);
18         while(j!=k-1){
19             if(j<k-1){
20                 start=j+1;
21                 j = partion(input,start,end);
22             }
23             else{
24                  end=j-1;
25                 j = partion(input,start,end);
26             }
27         }
28         
29         for(int m=0;m<k;m++)
30             res.add(input[m]);
31         return res;
32     }
33     private int partion(int a[] ,int lo,int hi){
34         int i = lo;
35         int j = hi+1;
36         int v = a[lo];
37         while(true){
38             while(a[++i]<v) if(i>=hi) break;
39             while(a[--j]>v) if(j<=lo) break;
40             if(i>=j) break;
41             swap(a,i,j);
42         }
43         swap(a,j,lo);
44         return j;
45     }
46     private void swap(int[] a,int i,int j){
47         int temp = a[j];
48         a[j] = a[i];
49         a[i] = temp;
50     }
51     
52 }

 

以上是关于29最小的K个数的主要内容,如果未能解决你的问题,请参考以下文章

29剑指offer--最小的K个数

剑指offer(29)最小的K个数

剑指Offer-29.最小的K个数(C++/Java)

分治04--最小的K个数

最大/最小de K个数/第K个数

《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数