码迷,mamicode.com
首页 > 其他好文 > 详细

29最小的K个数

时间:2017-12-14 03:35:29      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:tle   array   个数   快速   esc   else   输入   numbers   []   

题目描述

输入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个数

标签:tle   array   个数   快速   esc   else   输入   numbers   []   

原文地址:http://www.cnblogs.com/zle1992/p/8035546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!