1. 悄悄话
1.1. 题目描述
给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。
初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。
1.2. 输入描述
给定二叉树
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
注:-1表示空节点
1.3. 输出描述
返回所有节点都接收到悄悄话花费的时间
38
1.4. 用例
输入 0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
输出 38
说明
1.5. 题目解析
层序遍历二叉树,每次遍历一层,维护一个上层节点耗时,把对应位置的数加在一起就可以了。
1.6. 代码
class Solution:
def __call__(self, times: List[int]):
left = depth = 1
_times = [times[0]]
while left < len(times):
# 获取本层节点
right = left + 2 ** depth
# 本层节点与上层节点对应位置相加
for i in range(left, right, 2):
if i >= len(times):
break
cost = _times.pop(0)
x1, x2 = times[i:i+2]
_times.append((cost + x1) if x1 >= 0 else -1)
_times.append((cost + x2) if x2 >= 0 else -1)
# 更新节点
left, depth = right, depth + 1
return max(_times)
2. 求符合要求的结对方式
2.1. 题目描述
用一个数组A代表程序员的工作能力,公司想通过结对编程的方式提高员工的能力,假设结对后的能力为两个员工的能力之和,求一共有多少种结对方式使结对后能力为N。
2.2. 输入描述
5
1 2 2 2 3
4
第一行为员工的总人数,取值范围[1,1000]
第二行为数组A的元素,每个元素的取值范围[1,1000]
第三行为N的值,取值范围[1,1000]
2.3. 输出描述
4
满足结对后能力为N的结对方式总数。
2.4. 用例
输入 5
1 2 2 2 3
4
输出 4
说明 满足要求的结对方式为:A[0]和A[4],A[1]和A[2],A[1]和A[3],A[2]和A[3]。
2.5. 题目解析
最朴素的想法就是遍历两次,加和为target就输出
2.6. 代码
class Solution:
def __call__(self, nums: List[int], target: int):
nums.sort()
ans = []
for i, a in enumerate(nums[:-1]):
for j, b in enumerate(nums[i+1:], start=i+1):
if a + b == target:
ans.append((i, j))
elif a + b > target:
break
return set(ans)