前 K 个高频元素:
思路:
使用小项堆:先使用字典统计出现频率,通过小项堆遍历字典,进行排序,并且小项堆中只维护k个项
代码:
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
result = [0]*k
map_={}#使用map来装统计结果
for i in nums:#将元素的频率统计一下
map_[i] = map_.get(i,0)+1#注意是重新赋值
pri_que = []
for key ,value in map_.items():
heapq.heappush(pri_que,(value,key))#重点
if len(pri_que)>k:
heapq.heappop(pri_que)
for i in range(k-1,-1,-1):#注意range取不到最后一个值
result[i] =heapq.heappop(pri_que)[1]#因为加入的是键值对元组,但是结果只需要值
return result
遇到的问题:
小项堆的操作
1. heapq.heappush(pri_que,(value,key)) 此步,将一个元组压入小项堆中,同时小项堆会根据元组的第一个元素排序,当第一个元素相同时,会用第二个元素排序
2.result[i] =heapq.heappop(pri_que)[1] 此步heappop()括号内要是小项堆的容器
3.堆是基于列表实现的,在python中
二叉树递归遍历:
前中后指的是中的位置
前序遍历:
中左右
中序遍历:
左中右
后序遍历:
左右中
思路:
通过递归实现
1.确定递归函数的参数和返回值:
2.确定终止条件:
3.确定单层递归的逻辑:
二叉树的层序遍历:
思路:
长度法:使用一个队列,把每层的结点依次放入(不是一下子放入,而是放入弹出放入弹出的动态过程,先放入的是靠近根结点的点),当需要遍历记录树结点的值时,就弹出结点记录值,并且将结点的左右子结点加入队列,这样就保证了队列内是整个树从根节点,依次每层,从左到右的遍历所有结点。
代码:
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:#判断二叉树是否为空
return []
que = collections.deque([root])#初始化时括号内只能是一个可迭代对象,因为双端队列,会迭代括号内,并将其一一加入双端队列
result = []
while que :
re=[]
for i in range(len(que)):
cur=que.popleft()
re.append(cur.val)
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
result.append(re)
return result
遇到的问题:
1.对于双端队列的初始化: que = collections.deque([root]),初始化时括号内只能是一个可迭代对象,因为双端队列,会迭代括号内,并将其一一加入双端队列

被折叠的 条评论
为什么被折叠?



