• 相同的树


    题目描述

    给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

    示例 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    输入:

    1 1
    / \ / \
    2 3 2 3

    [1, 2, 3], [1, 2, 3]

    输出: true

    示例 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    输入:

    1 1
    / \
    2 2

    [1, 2], [1, null, 2]

    输出: false

    示例 3:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    输入:

    1 1
    / \ / \
    2 1 1 2

    [1, 2, 1], [1, 1, 2]

    输出: false
  • 课程表


    题目描述

    你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse - 1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0, 1]。给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

    示例 1:

    输入: 2, [[1, 0]]
    输出: true
    解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

    示例 2:

    输入: 2, [[1, 0], [0, 1]]
    输出: false
    解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

  • 魔术索引


    题目描述

    魔术索引。 在数组 A[0…n-1] 中,有所谓的魔术索引,满足条件 A[i] = i 。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组 A 中找出一个魔术索引,如果没有,则返回 -1。若有多个魔术索引,返回索引值最小的一个。

    示例1:

    输入: nums = [0, 2, 3, 4, 5]
    输出: 0
    说明: 0 下标的元素为 0

    示例2:

    输入: nums = [1, 1, 1]
    输出: 1

    说明:

    nums 长度在 [1, 1000000] 之间

  • 字符串相加


    题目描述

    给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和。

    提示:

    • num1 和 num2 的长度都小于 5100
    • num1 和 num2 都只包含数字 0-9
    • num1 和 num2 都不包含任何前导零
    • 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式
  • 黄金矿工


    题目描述

    你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。为了使收益最大化,矿工需要按以下规则来开采黄金:

    • 每当矿工进入一个单元,就会收集该单元格中的所有黄金。
    • 矿工每次可以从当前位置向上下左右四个方向走。
    • 每个单元格只能被开采(进入)一次。
    • 不得开采(进入)黄金数目为 0 的单元格。
    • 矿工可以从网格中任意一个有黄金的单元格出发或者是停止。

    示例 1:

    1
    2
    3
    4
    5
    6
    7
    输入:grid = [[0, 6, 0], [5, 8, 7], [0, 9, 0]]
    输出:24
    解释:
    [[0, 6, 0],
    [5, 8, 7],
    [0, 9, 0]]
    一种收集最多黄金的路线是:9 -> 8 -> 7。

    示例 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    输入:grid = [[1, 0, 7], [2, 0, 6], [3, 4, 5], [0, 3, 0], [9, 0, 20]]
    输出:28
    解释:
    [[1, 0, 7],
    [2, 0, 6],
    [3, 4, 5],
    [0, 3, 0],
    [9, 0, 20]]
    一种收集最多黄金的路线是:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7。

    提示:

    • 1 <= grid.length, grid[i].length <= 15
    • 0 <= grid[i][j] <= 100
    • 最多 25 个单元格中有黄金。
  • 扫雷游戏


    題目描述

    让我们一起来玩扫雷游戏!

    给定一个代表游戏板的二维字符矩阵。 ‘M’ 代表一个未挖出的地雷,’E’ 代表一个未挖出的空方块,’B’ 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字(’1’ 到 ‘8’)表示有多少地雷与这块已挖出的方块相邻,’X’ 则表示一个已挖出的地雷。现在给出在所有未挖出的方块中(’M’或者’E’)的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:

    1. 如果一个地雷(’M’)被挖出,游戏就结束了- 把它改为 ‘X’。
    2. 如果一个没有相邻地雷的空方块(’E’)被挖出,修改它为(’B’),并且所有和其相邻的未挖出方块都应该被递归地揭露。
    3. 如果一个至少与一个地雷相邻的空方块(’E’)被挖出,修改它为数字(’1’到’8’),表示相邻地雷的数量。
    4. 如果在此次点击中,若无更多方块可被揭露,则返回面板。

    示例 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    输入:

    [['E', 'E', 'E', 'E', 'E'],
    ['E', 'E', 'M', 'E', 'E'],
    ['E', 'E', 'E', 'E', 'E'],
    ['E', 'E', 'E', 'E', 'E']]

    Click : [3,0]

    输出:

    [['B', '1', 'E', '1', 'B'],
    ['B', '1', 'M', '1', 'B'],
    ['B', '1', '1', '1', 'B'],
    ['B', 'B', 'B', 'B', 'B']]

    解释:

    示例 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    输入:

    [['B', '1', 'E', '1', 'B'],
    ['B', '1', 'M', '1', 'B'],
    ['B', '1', '1', '1', 'B'],
    ['B', 'B', 'B', 'B', 'B']]

    Click : [1,2]

    输出:

    [['B', '1', 'E', '1', 'B'],
    ['B', '1', 'X', '1', 'B'],
    ['B', '1', '1', '1', 'B'],
    ['B', 'B', 'B', 'B', 'B']]

    解释:

    注意:

    1. 输入矩阵的宽和高的范围为 [1, 50]。
    2. 点击的位置只能是未被挖出的方块 (‘M’ 或者 ‘E’),这也意味着面板至少包含一个可点击的方块。
    3. 输入面板不会是游戏结束的状态(即有地雷已被挖出)。
    4. 简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。
  • 二叉树的最大深度


    题目描述

    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

    说明: 叶子节点是指没有子节点的节点。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    给定二叉树 [3, 9, 20, null, null, 15, 7],

    3
    / \
    9 20
    / \
    15 7
    返回它的最大深度 3 。
  • 有效的括号


    题目描述

    给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:

    • 左括号必须用相同类型的右括号闭合。
    • 左括号必须以正确的顺序闭合。

    注意: 空字符串可被认为是有效字符串。

    示例 1:

    输入: “()”
    输出: true

    示例 2:

    输入: “()[]{}”
    输出: true

    示例 3:

    输入: “(]”
    输出: false

    示例 4:

    输入: “([)]”
    输出: false

    示例 5:

    输入: “{[]}”
    输出: true

  • 判断子序列


    题目描述

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ≈ 500,000),而 s 是个短字符串(长度 <= 100)。

    字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。

    示例 1:

    s = “abc”, t = “ahbgdc”
    返回 true.

    示例 2:

    s = “axc”, t = “ahbgdc”
    返回 false.

  • 除数博弈


    题目描述

    爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:

    • 选出任一 x,满足 0 < x < N 且 N % x == 0 。
    • 用 N - x 替换黑板上的数字 N 。

    如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 False。假设两个玩家都以最佳状态参与游戏。

    示例 1:

    输入:2
    输出:true
    解释:爱丽丝选择 1,鲍勃无法进行操作。

    示例 2:

    输入:3
    输出:false
    解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。

    提示:

    • 1 <= N <= 1000