给定K个有序序列,输出合并后有序序列
来源:互联网 发布:最新java培训视频教程 编辑:程序博客网 时间:2024/06/13 10:56
假设有这么一道题
给定K个有序序列,输出合并后有序序列
A1=[5,8,11,。。。。]n
A2=[4,6,10,。。。。]n
A3=[1,2,3,。。。。]n
。。。。
AK=[100,200,300,。]n
这里n代表的是这个数组的长度是统一的。
在这里,我们给出三种做法
其算法复杂度不同
我们这里就先用
A1=[5,8,11]n
A2=[4,6,10]n
A3=[1,2,3]n
来做测试数据吧
方法一全部加起来再排序。时间复杂度O(nklog(nk))
A[]=A1[]+A2[]+…Ak[];
Sort(A[]);很蠢的一种方式
static void answer1(List<int[]> list) { int A[]=new int[(list.get(0)).length*list.size()]; for(int i=0,k=0;i<list.size();i++) { for(int j=0;j<list.get(0).length;j++,k++) { A[k]=list.get(i)[j]; } } System.out.println("方法一"); Arrays.sort(A); for(int i=0;i<A.length;i++) { System.out.print(A[i]+" "); } System.out.println(); }
方法二 用类似于margsort的思想去求,时间复杂度O(nk^2)
static void answer2(List<int[]> list) { int A[]=new int[(list.get(0)).length*list.size()]; //预处理下 List<List<Integer>> curry=new ArrayList<List<Integer>>(); for(int i=0;i<list.size();i++) { List<Integer> temp=new ArrayList<Integer>(); for(int j=0;j<list.get(0).length;j++) { temp.add(list.get(i)[j]); } curry.add(temp); } int i=0,n=curry.size(); while(n!=0) { int min=curry.get(0).get(0),index=0; for(int j=0;j<n;j++) { if(curry.get(j).get(0)<min) { min=curry.get(j).get(0); index=j; } } A[i]=min; i++; curry.get(index).remove(0); //如果有null的。就去掉。动态改变curry的大小 List<List<Integer>> nullArr=new ArrayList<List<Integer>>(); List<Integer> nul=new ArrayList<Integer>(); nul.add(null); nul.remove(null); nullArr.add(nul); curry.removeAll(nullArr); n=curry.size(); } System.out.println("方法二"); Arrays.sort(A); for(int j=0;j<A.length;j++) { System.out.print(A[j]+" "); } System.out.println();
方法三 用堆去处理,时间复杂度是O(nklogk)
static void answer3(List<int[]> list) { PriorityQueue<Integer> temp=new PriorityQueue<Integer>(); for(int i=0;i<list.size();i++) { for(int j=0;j<list.get(i).length;j++) { temp.add(list.get(i)[j]); } } System.out.println("方法三"); while(!temp.isEmpty()) { System.out.print(temp.poll()+" "); } System.out.println(); }
很明显。最后一种方式最快。这也和堆的性质有关。堆比较适合用在那些需要多次取最值的问题中
0 0
- 给定K个有序序列,输出合并后有序序列
- 合并两个有序序列
- 合并两个有序序列
- 合并两个有序序列
- 合并两个有序序列
- 合并k个有序数组
- 合并K个有序数组
- 合并K个有序数组
- 若干有序序列,合并成一个新的有序序列
- O(lg m + lgn)时间复杂度求两个有序序列合并后第K大的数
- 两个有序序列的合并算法
- Java合并两个有序序列算法实现
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- solr在使用solrj操作中的各个操作大全(在solrcores中测试)(转自:http://blog.csdn.net/a925907195/article/details/42491157)
- 22. Generate Parentheses(第六周)
- github上比较好用的第三方库
- 58到家入驻微信钱包的技术优化
- 自定义滚轮
- 给定K个有序序列,输出合并后有序序列
- 井字棋
- [LeetCode]349. Intersection of Two Arrays(两数组的交集)
- 一个低概率core dump问题的解决------static搞起
- Tensorflow--GPU/CPU/ contain variables in different devices
- spring+TestNG 单元测试
- 微信为啥不丢“离线消息”?
- 根据Hibernate映射文件和实体类生成数据库
- bootstrap table 主子表 局部数据刷新(刷新子表)