LeetCode刷题实录Python篇(三)

104 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

视频

www.bilibili.com/video/BV1eZ…

剑指 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)

视频

www.bilibili.com/video/BV153…

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 <= 109
  • 0 <= blacklist.length <= min(105, n - 1)
  • 0 <= blacklist[i] < n
  • blacklist 中所有值都 不同
  •  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()

视频

www.bilibili.com/video/BV1B9…