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 }
时间: 2024-08-16 20:15:52

29最小的K个数的相关文章

29.最小的K个数

题目描述: ??输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路分析: ??利用快速排序的partition函数,partition函数会在数组中找到一个Key值,然后将小于Key的放到它前面,大于Key的放到它后面,我们只需要判断Key的下标t是否等于K,如果等于K那么返回数组的前K个数,如果小于Key那么我们缩小范围,将数组的low更新为t+1,再进行查找,如果大于K,那么将high更新为t-1.直达K等于t.时

剑指offer[29]——最小的K个数

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这道题目对js来讲应该是很简单了,js有自带的sort函数,我们将输入的数组进行排序之后,输出前k个数就是题目要求 的结果. function GetLeastNumbers_Solution(input, k) { if(k==0 || k>input.length){return [];} input = input.sort((a,b) => a-b);

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

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的方法,详见我的另一篇文章:基于快排思想查找第K大的数或第K小的数. 第二种就是利用一个长度为k的额外容器,来存储最小的K个数字.容器未满则填满,再添加数字是,将数字和容器的最大值比较,小的话就替换,大的话舍去. 这个容器要求可以直接得到最大值.能删除最大值,能添加值.那么很容易想到应该用最大堆当这个

找到无序数组中最小的k个数

题目:给定一个无序整数数组arr,找到其中最小的k个数 要求:如果数组arr的长度为n,排序之后自然可以得到最小的k个数,此时时间复杂度与排序的时间复杂度相同均为O(NlogN),本题要求实现时间复杂度为O(NLogK). 1.O(NLogK)的方法,即一直维护一个有k个数的最大的大根堆,这个堆是目前选出的k个最小数,在堆里的k个元素中堆顶的元素是最大的一个. 接下来遍历整个数组,遍历的过程中看当前数是否比堆顶元素小.如果是,就把堆顶的元素替换成当前的数,然后从堆顶的位置调整堆,替换后堆的最大元

编程算法 - 最小的k个数 红黑树 代码(C++)

最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用红黑树(multiset), 每次替换最大的值, 依次迭代. 时间复杂度: O(nlogk). 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <iostream> #include <vector> #includ

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

最小的K个数

输入n个数,找出其中最小的k个数.例如输入4,5,1,6,2,7,3,8 这8个数,则最小的4个数是1,2,3,4. 解法一:O(n)的算法,只有当我们可以修改输入数组时可用 1 int Partitoin(int* input, int low, int high) 2 { 3 if (input == NULL || low < 0 || high < 0 || low > high) 4 { 5 return -1; 6 } 7 int temp = input[low]; 8 w

【面试题030】最小的k个数

[面试题030]最小的k个数 题目: 输入n个整数,找出其中最小的k个数. 例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4. 思路一: 可以同样的基于随机快速排序的Partition函数,来对数组做划分, 基于k来作调整,返回调用Partition函数,直到左边的k个数字是整个数组中最小的k个数字. ps.这种方法要修改数组中数字的顺序,因为Partition函数会调整数组中数字的顺序. 12345678910111213141516171819202122

java实现——030最小的k个数

1.O(nlogk)海量数据 1 import java.util.TreeSet; 2 3 public class T030 { 4 public static void main(String[] args){ 5 int[] data = {4,5,1,6,2,7,3,8}; 6 TreeSet<Integer> leastNumbers = new TreeSet<Integer>(); 7 getLeastNumbers(data,leastNumbers,4); 8