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
9 }
10 public static void getLeastNumbers(int[] data,TreeSet<Integer> leastNumbers,int k){
11 leastNumbers.clear();
12 if(k<1||data.length<k)
13 return;
14
15 for(int i=0;i<data.length;i++){
16 if(leastNumbers.size()<k)
17 leastNumbers.add(data[i]);
18 else{
19 System.out.println(leastNumbers.last().hashCode());
20 if(data[i]<leastNumbers.last().hashCode()){
21 leastNumbers.remove(leastNumbers.last());
22 leastNumbers.add(data[i]);
23 }
24
25 }
26 }
27 System.out.println(leastNumbers.toString());
28 }
29 }

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

时间: 2024-08-13 19:39:49

java实现——030最小的k个数的相关文章

剑指Offer面试题30(java版):最小的k个数

题目:输入n个整数,找出其中最小的k个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4 这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数.这种思路的时间复杂度是O(nlogn),面试官会提示我们还有更快的算法. 解法一:O(n)的算法,只有当我们可疑修改输入的数组时可用 从上一题中我们可以得到启发,我们同样可以基于Partition函数来解决这个问题.如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数

【面试题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

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

题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 分析: 最先想到的是将数组升序排列,返回前k个元素.不过排序的话效率可能会较低,我们可以使用优先级队列模拟堆来处理. 模拟一个k个元素的最大堆,当堆内元素个数等于k的时候,新来的元素就要和堆顶元素去比较,如果小于堆顶元素,就删除堆顶元素,将新元素添加进堆中,由于最大堆的堆顶元素是最大元素,我们可以保持堆中元素始终是最小的几个,因为每有新的元素来,都会进行比较,最后堆

时间效率:最小的K个数

输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.ArrayList; import java.util.Iterator; import java.util.TreeSet; /* * 利用TreeSet排序并去除重复元素,利用ArrayList存储并输出 */ public class Solution { public ArrayList<Integer> GetLeastNumb

最小的K个数-剑指Offer

最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路 可以用快速排序的思想,分块,直到分出前k个为止,前k个不一定是按顺序的,注:这个方法需要改变数组 可以借助一个k容量的辅助空间,最大堆或红黑树,这个方法处理大数组小k的情况比较合适,且不用改变原始数组 代码 import java.util.ArrayList; public class Solution { public ArrayList<

求数组中最小的k个数

题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.ArrayList; import java.util.Comparator; import java.util.PriorityQueue; import org.junit.Test; public class GetLeastNumbers_Solution { /** * 基于优先队列,时间复杂度为

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 publi

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.时

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

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