23。合并K个排序链表<<<<主题传送门标题描述合并k个排序链表,返回合并后的排序链表。请分析并描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出:1->1->2->3->4->4->5->6题解,这个不难想到,读取所有链表节点的值,然后构造最小堆,不断取堆顶元素得到结果。#单链表的定义。#classListNode:#def__init__(self,x):#self.val=x#self.next=Nonefromheapqimportheapify,heappopclass解决方案:defmergeKLists(self,lists:List[ListNode])->ListNode:#获取所有节点nodes=[]fornodeinlists:whilenode:nodes.append(node.val)node=node.next#由于报错,添加后的节点值列表是否为空,如果为空则直接返回(heappop(nodes))cur_node.next=next_nodecur_node=next_node返回head347。前K个高频元素<<<<题目传送门描述给定一个非空整数数组,返回前k个出现频率最高的元素。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1]解释:你可以假设给定的k总是合理的,并且1≤k≤数组中不同元素的数量。您的算法的时间复杂度必须优于O(nlogn),其中n是数组的大小。解题思路比较清晰,因为是用Python解决的。就这么玩,用Counter统计元素的出现频率,用heapq解决。与正常操作相比,它太简单了。先建立映射,再维护一个之前k最大的堆。#很不要脸的写法,不过真的很好吃。O(∩_∩)Ohaha~importheapqfromcollectionsimportCounterclass解决方案:deftopKFrequent(self,nums,k:int):counts=Counter(nums)#这里的key需要传入func(functionha)returnheapq.nlargest(k,counts.keys(),key=counts.get)
