LeetCode上说明的问题如下:
合并k个排序链表,并将其作为一个排序列表返回。分析并描述其复杂性。
例子:
输入:[1-
我能够通过131个测试案例中的129个,但在案例130中达到了“超出时间限制”。下面是我的实现。
有人能发现瓶颈吗?对提高时间复杂度有什么建议吗?
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# def print_lists(self, lists):
# idx = 0
# while idx < len(lists):
# ptr = lists[idx]
# _l = []
# while ptr is not None:
# _l.append(ptr.val)
# ptr = ptr.next
# idx += 1
# print(_l)
def min_idx(self, lists):
idx = 0
for i in range(len(lists)):
if lists[i] is None:
continue
elif lists[idx] is None:
idx = i
elif lists[i].val < lists[idx].val:
idx = i
return idx
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
head = tail = ListNode(-1)
while len(lists) > 0:
m_idx = self.min_idx(lists)
if lists[m_idx] is None:
return head.next
tail.next = lists[m_idx]
tail = tail.next
lists[m_idx] = lists[m_idx].next
if lists[m_idx] is None:
del lists[m_idx]
return head.next
我在没有使用del
的情况下遇到了超过时间限制的问题。测试用例130包含10,000个LinkedList。
下面是一个更简单、更快速的代码版本,它避免了几个if:
def min_idx(self, lists):
idx = 0
for i in range(len(lists)):
if lists[i].val < lists[idx].val:
idx = i
return idx
def mergeKLists(self, lists):
head = tail = ListNode(-1)
lists = list(filter(lambda x: x is not None, lists))
while len(lists) > 0:
m_idx = self.min_idx(lists)
tail.next = lists[m_idx]
tail = tail.next
lists[m_idx] = lists[m_idx].next
if lists[m_idx] is None:
del lists[m_idx]
return head.next
为了获得更好的效果,您需要将实现更改为:
我有一个关于python中链接列表的快速问题。在下面显示的解决方案代码中,当我尝试合并两个排序的链接列表时。我对包含的if和elif语句的条件感到困惑。例如,如果l1不为空,l2为空,我想将l1中的其余3个元素添加到我的新链接列表中,但代码显示l1和tail没有更新,所以它不是只添加3个元素中的一个吗? 我的另一个问题是关于返回head.next.返回会自动返回从head.next到null pt
我收到一份作业,要求我将总共有N个元素的K个排序列表有效地合并到一个排序列表中。我偶然发现的方法是使用最小堆对K列表中的元素进行排序,或者使用分而治之的方法(成对合并)。该线程中的注释表明,分而治之方法的时间复杂度为O(NK),而最小堆方法的时间复杂度为O(N log K),两者的空间复杂度相同。我还访问了许多其他线程,但我不能得到一个清晰的图片。 怀疑 许多其他网站告诉我们,两者都存在分歧
快速选择 堆 1. Kth Element 桶排序 1. 出现频率最多的 k 个元素 2. 按照字符出现次数对字符串排序 荷兰国旗问题 1. 按颜色进行排序 快速选择 用于求解 Kth Element 问题,也就是第 K 个元素的问题。 可以使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。 堆 用于求解 TopK Elements 问题,也
我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。
我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?
我已经阅读并理解了Mergesort的工作原理(作为文本),现在我正在尝试对其进行编码。我已经完成了分割数据的部分(我使用向量),直到它的每个大小都为1。现在我已经在Mergesort中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小