携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
515. 在每个树行中找最大值
题目 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9] 输出: [1,3,9] 示例2:
输入: root = [1,2,3] 输出: [1,3]
提示:
二叉树的节点个数的范围是 [0,104] -231 <= Node.val <= 231 - 1
代码
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
import queue
class Solution:
def largestValues(self, root: Optional[TreeNode]) -> List[int]:
q = queue.Queue()
ans = []
if root is None:
return ans
q.put([root, 0])
curidx = -1
while not q.empty():
node, idx = q.get()
if idx > curidx:
ans.append(node.val)
curidx = idx
elif idx == curidx and ans[idx] < node.val:
ans[idx] = node.val
if node.left is not None:
q.put([node.left, idx+1])
if node.right is not None:
q.put([node.right, idx+1])
return ans
视频
剑指 Offer II 091. 粉刷房子
题目
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。
请计算出粉刷完所有房子最少的花费成本。
示例 1:
输入: costs = [[17,2,17],[16,16,5],[14,3,19]] 输出: 10 解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。 最少花费: 2 + 5 + 3 = 10。 示例 2:
输入: costs = [[7,6,2]] 输出: 2
提示:
costs.length == n costs[i].length == 3 1 <= n <= 100 1 <= costs[i][j] <= 20
代码
class Solution:
def minCost(self, costs: List[List[int]]) -> int:
length = len(costs)
dp = [[0, 0, 0] for _ in range(length)]
dp[0] = costs[0]
for i in range(1, length):
for j in range(3):
dp[i][j] = min(dp[i-1][(j+1)%3], dp[i-1][(j+2)%3]) + costs[i][j]
return min(dp[length-1])
class Solution:
def minCost(self, costs: List[List[int]]) -> int:
# 下面来讲一下优化
# 由于状态转移是由i-1向i转移的,所以我们就不需要i了,直接利用循环转移即可
length = len(costs)
# dp = [[0, 0, 0] for _ in range(length)]
dp = costs[0].copy()
for i in range(1, length):
dp = [min(dp[(j+1)%3], dp[(j+2)%3]) + c for j, c in enumerate(costs[i])]
return min(dp)
视频
710. 黑名单中的随机数
题目
给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法,从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。
优化你的算法,使它最小化调用语言 内置 随机函数的次数。
实现 Solution 类:
Solution(int n, int[] blacklist)初始化整数n和被加入黑名单blacklist的整数int pick()返回一个范围为[0, n - 1]且不在黑名单blacklist中的随机整数
示例 1:
输入
["Solution", "pick", "pick", "pick", "pick", "pick", "pick", "pick"]
[[7, [2, 3, 5]], [], [], [], [], [], [], []]
输出
[null, 0, 4, 1, 6, 1, 0, 4]
解释 Solution solution = new Solution(7, [2, 3, 5]);
solution.pick(); // 返回0,任何[0,1,4,6]的整数都可以。注意,对于每一个pick的调用,
// 0、1、4和6的返回概率必须相等(即概率为1/4)。
solution.pick(); // 返回 4
solution.pick(); // 返回 1
solution.pick(); // 返回 6
solution.pick(); // 返回 1
solution.pick(); // 返回 0
solution.pick(); // 返回 4
提示:
1 <= n <= 1090 <= blacklist.length <= min(105, n - 1)0 <= blacklist[i] < nblacklist中所有值都 不同-
pick最多被调用2 * 104次
代码
class Solution:
def __init__(self, n: int, blacklist: List[int]):
self.bound = n - len(blacklist)
black = [b for b in blacklist if b >= self.bound]
w = self.bound
self.rdict = {}
for b in blacklist:
if b < self.bound:
while w in black:
w += 1
self.rdict[b] = w
w += 1
def pick(self) -> int:
rd = randint(0, self.bound-1)
return self.rdict.get(rd, rd)
# Your Solution object will be instantiated and called as such:
# obj = Solution(n, blacklist)
# param_1 = obj.pick()
视频