携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
508. 出现次数最多的子树元素和
题目
给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3] 输出: [2,-3,4] 示例 2:
输入: root = [5,2,-5] 输出: [2]
提示:
节点数在 [1, 104] 范围内 -105 <= Node.val <= 105
视频
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findFrequentTreeSum(self, root: TreeNode) -> List[int]:
node_dict = dict()
def node_sum(root:TreeNode):
if root is None:
return 0
data = root.val + node_sum(root.left) + node_sum(root.right)
if data not in node_dict.keys():
node_dict[data] = 1
else:
node_dict[data] += 1
return data
node_sum(root)
node_dict = sorted(node_dict.items(), key=lambda x:x[1], reverse=True)
sum_list = list()
max_sum = node_dict[0][1]
for item in node_dict:
if item[1] == max_sum:
sum_list.append(item[0])
return sum_list
1089. 复写零
题目
给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
示例 1:
输入:[1,0,2,3,0,4,5,0] 输出:null 解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4] 示例 2:
输入:[1,2,3] 输出:null 解释:调用函数后,输入的数组将被修改为:[1,2,3]
提示:
1 <= arr.length <= 10000 0 <= arr[i] <= 9
视频
代码
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
"""
Do not return anything, modify arr in-place instead.
"""
length = len(arr)
for i in range(length):
if arr[i] == 0:
arr.append(0)
i = length - 1
j = len(arr) - 1
while i >= 0:
if arr[i] == 0:
arr[j] = 0
j-=1
i-=1
arr[j]=0
j-=1
else:
arr[j] = arr[i]
j-=1
i-=1
for i in range(len(arr) - length):
arr.pop()
剑指 Offer 14- I. 剪绳子
题目
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]k[1]...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
示例 1:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 示例 2:
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36 提示:
2 <= n <= 58
视频
代码
class Solution:
def cuttingRope(self, n: int) -> int:
dp = [0] * 60
for i in range(2, n+1):
for j in range(1, i):
dp[i] = max(dp[i], j * max(dp[i-j], i-j))
return dp[n]