合并k个有序数组
给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组
可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下:
创建一个大小为n*k的数组保存最后的结果
创建一个大小为k的最小堆,堆中元素为k个数组中的每个数组的第一个元素
重复下列步骤n*k次:
每次从堆中取出最小元素(堆顶元素),并将其存入输出数组中
用堆顶元素所在数组的下一元素将堆顶元素替换掉,
如果数组中元素被取光了,将堆顶元素替换为无穷大。每次替换堆顶元素后,重新调整堆
初始化最小堆的时间复杂度O(k),总共有kn次循环,每次循环调整最小堆的时间复杂度是O(logk),所以总的时间复杂度是O(knlogk)
代码如下,已测试通过:
import sys class HeapNode:
def __init__(self,x,y=0,z=0):
self.value=x
self.i=y
self.j=z def Min_Heap(heap):#构造一个堆,将堆中所有数据重新排序
HeapSize = len(heap)#将堆的长度单独拿出来方便
for i in range((HeapSize -2)//2,-1,-1):#从后往前出数
Min_Heapify(heap,i) def Min_Heapify(heap,root):
heapsize=len(heap)
MIN=root
left=2*root+1
right=left+1
if left<heapsize and heap[MIN].value>heap[left].value:
MIN=left
if right <heapsize and heap[MIN].value>heap[right].value:
MIN=right
if MIN!=root:
heap[MIN], heap[root] = heap[root], heap[MIN]
Min_Heapify(heap, MIN) def MergeKArray(nums,n):
# 合并k个有序数组,每个数组长度都为k
knums=[]
output=[]
for i in range(len(nums)):
subnums=nums[i]
knums.append(HeapNode(subnums[0],i,1))
#k个元素初始化最小堆
Min_Heap(knums) for i in range(len(nums)*n):
# 取堆顶,存结果
root=knums[0]
output.append(root.value)
#替换堆顶
if root.j<n:
root.value=nums[root.i][root.j]
root.j+=1
else:
root.value=sys.maxsize
knums[0]=root
Min_Heapify(knums,0)
return output knums=[[1,2,3],[1,3,6],[4,5,8]]
print(MergeKArray(knums,3))
合并k个有序数组的更多相关文章
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- 合并K个有序数组-Java
package com.rao.algorithm; import java.util.Arrays; /** * @author Srao * @className MergeK * @date 2 ...
- Merge k Sorted Arrays【合并k个有序数组】【优先队列】
Given k sorted integer arrays, merge them into one sorted array. Example Given 3 sorted arrays: [ [1 ...
- 合并两个有序数组a和b到c
问题:两个有序数组a和b,合并成一个有序数组c. // 合并两个有序数组a和b到c void Merge_Array(int a[], int n, int b[], int m, int c[]) ...
- Leecode刷题之旅-C语言/python-88合并两个有序数组
/* * @lc app=leetcode.cn id=88 lang=c * * [88] 合并两个有序数组 * * https://leetcode-cn.com/problems/merge-s ...
- leetcode 88. C++ 合并两个有序数组
Leetcode 88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- 高效合并两个有序数组(Merge Sorted Array)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...
- leetcode-只出现一次的数字合并两个有序数组
题目:合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...
随机推荐
- python3—列表
列表是什么 name = ["jim", "lilei", "lucy"] #方括号表示,逗号分隔 print(name) print(na ...
- PHP设计模式注意点
PHP命名空间 可以更好地组织代码,与Java中的包类似. Test1.php <?php namespace Test1;//命名空间Test1 function test(){ echo _ ...
- 4.1.6 Grundy数-硬币游戏2
Problem Description: Alice 和 Bob 在玩一个游戏.给定 k 个数字 a1,a2,……,ak.一开始,有n堆硬币,每堆各有 Xi 枚硬币.Alice 和 Bob 轮流选出一 ...
- DFS CCPC2017 南宁I题
The designers have come up with a new simple game called “Rake It In”. Two players, Alice and Bob, i ...
- spring boot(七)mybatis多数据源解决方案
说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...
- Matlab-4:追赶法(crout分解)工具箱
function x=chase (a,b,c,f) % the method of chaase******************************* % a, b, c,分别是是方程组的下 ...
- AWS EC2 MySQL迁移到RDS案例
Amazon Relational Database Service (Amazon RDS) 是一种Web 服务,可让用户更轻松地在云中设置.操作和扩展关系数据库.它可以为行业标准关系数据库提供经济 ...
- 1.Liunx 文件管理
文件管理命令 1.基本命令:ls .cd .pwd .man 2.文件操作:touch . cp . rm . mv .ln . mkdir . rmdir 3.文件查看:cat .more .les ...
- [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)
转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...
- js正则表达式取{}中的值
var reg = /[^\{}]*\{(.*)\}[^\}]*/; var str = "1111{122}"; console.log(str.replace(reg,'$1' ...