回溯 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串 word,判断 word 是否存在于网格中。 单词必须按照字母顺序,通过水平或垂直方向相邻的单元格构成。同一个单元格内的字母在一次搜索中不能重复使用。 示例 1: 输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E&
回溯 括号生成 数字 n 代表生成括号的对数,请设计一个函数,生成所有可能的并且有效的括号组合。 示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"] 示例 2: 输入:n = 1 输出:["()"] 提示: * 1 <= n <= 8 回溯: class Solution { public: vector<string> generateParenthesis(int n) { vector<string>
算法 组合总和 给你一个无重复元素的整数数组 candidates 和一个目标整数 target,找出 candidates 中可以使数字和为 target 的所有不同组合。 candidates 中的同一个数字可以无限制重复选取。如果至少一个数字的选取数量不同,则两种组合不同。 示例 1: 输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释:2 + 2 + 3 = 7,7 = 7。 示例 2: 输入:candidates = [2,3,5], target = 8 输出:[[2,2,2,2],[2,
回溯 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串 digits,返回所有它能表示的字母组合。答案可以按任意顺序返回。 数字到字母的映射与电话按键相同,数字 1 不对应任何字母。 示例 1: 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例 2: 输入:digits
回溯 子集 给你一个整数数组 nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。 解集不能包含重复的子集。你可以按任意顺序返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 示例 2: 输入:nums = [0] 输出:[[],[0]] 提示: * 1 <= nums.length <= 10 * -10 <= nums[i] <= 10 * nums 中的所有元素互不相同 解法一(
算法 全排列 给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3: 输入:nums = [1] 输出:[[1]] 提示: * 1
图 实现 Trie (前缀树) Trie(发音类似 "try")或者说前缀树,是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 请你实现 Trie 类: * Trie() 初始化前缀树对象。 * void insert(String word) 向前缀树中插入字符串 word。 * boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false。 * boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix,返回 true;否则,返回 false。 示例: 输入
图 课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。 在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi],表示如果要学习课程 ai,则必须先学习课程 bi。 例如,先修课程对 [0, 1] 表示:想要学习课程 0,你需要先完成课程 1。 请你判断是否可能完成所有课程的学习?如果可以,返回 true;否则,返回 false。 示例 1: 输入:numCourses = 2, prerequisites = [[1,0]] 输出:true 解释:总共有 2
算法 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可能是: * 0:空单元格 * 1:新鲜橘子 * 2:腐烂的橘子 每分钟,腐烂的橘子会使周围四个方向上相邻的新鲜橘子腐烂。 返回直到没有新鲜橘子为止所必须经过的最小分钟数。如果不可能让所有新鲜橘子腐烂,返回 -1。 示例 1: 输入:grid = [[2,1,1],[1,1,0],[0,1,1]] 输出:4 示例 2: 输入:grid = [[2,1,1],[0,1,1],[1,0,1]] 输出:-1
二分查找 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序数组 nums1 和 nums2,找出并返回这两个正序数组的中位数。 要求算法的时间复杂度为 O(log (m + n))。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3],中位数是 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4]
图 岛屿数量 给定一个由字符 '1' 和 '0' 组成的二维网格,其中 '1' 代表陆地,'0' 代表水。水平或竖直方向相邻的陆地属于同一座岛屿,求网格中的岛屿数量。 示例 示例 1 输入:grid = [['1','1','1','1','0'], ['1','1','0','
二分查找 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次旋转后,得到输入数组。 例如,原数组: nums = [0,1,2,4,5,6,7] 在变化后可能得到: * 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] * 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[
树 二叉树中的最大路径和 二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。 同一个节点在一条路径序列中至多出现一次。 该路径至少包含一个节点,且不一定经过根节点。 路径和是路径中各节点值的总和。 给你一个二叉树的根节点 root,返回其最大路径和。 示例 1: 输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3,路径和为 2 + 1 + 3 = 6。 示例 2: 输入:root = [-10,9,20,null,null,15,7] 输出:42 解释:最优路径是 15 -> 20 -> 7,
二分查找 搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k 上进行了向左旋转,使数组变为: [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] 下标从 0 开始计数。 例如,[0,1,2,4,5,6,7] 在下标 3 上向左旋转后可能变为: [4,5,6,7,0,1,2] 给你旋转后的数组 nums 和一个整数 target,
队列 二叉树的最近公共祖先 给定一个二叉树,找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为: 对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大。 一个节点也可以是它自己的祖先。 示例 1: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点 5 和节点 1 的最近公共祖先是节点 3。 示例 2: 输入:
算法 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2: 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1] 示例 3: 输入:nums = [], target
树 路径总和 III 给定一个二叉树的根节点 root,和一个整数 targetSum,求该二叉树里节点值之和等于 targetSum 的路径数目。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的,只能从父节点到子节点。 示例 1: 输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条。 示例 2: 输入:root = [5,4,8,11,null,13,4,7,2,null,
二分查找 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: * 每行中的整数从左到右按非严格递增顺序排列。 * 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target,如果 target 在矩阵中,返回 true;否则,返回 false。 你必须编写一个时间复杂度为 O(log(m * n)) 的解决方案。 示例 1: 输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true 示例 2: 输入:matrix = [[1,3,5,
算法 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder,其中 preorder 是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 先序遍历顺序是: 根节点 -> 左子树 -> 右子树 中序遍历顺序是: 左子树 -> 根节点 -> 右子树 示例 1: 输入:preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] 输出:[3,9,20,null,null,15,7] 示例 2: 输入:preorder = [-1]
二分查找 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入:nums = [1,3,5,6], target = 5 输出:2 示例 2: 输入:nums = [1,3,5,6], target = 2 输出:1 示例 3: 输入:nums = [1,3,5,6], target = 7 输出:4 提示: * 1 <= nums.
树 展开二叉树 给你二叉树的根节点 root,请你将它展开为一个单链表。 * 展开后的单链表继续使用 TreeNode,其中 right 子指针指向链表中的下一个节点,left 子指针始终为 nullptr。 * 展开后的单链表顺序应该和二叉树的先序遍历顺序相同。 示例 1: 输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [0] 输出:[0] 提示: * 树中节点数在范围 [0,
栈 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形由高度为 5 和 6 的两个柱子组成,宽度为 2,面积为 10。 示例 2: 输入:heights = [2,4] 输出:4 提示: * 1 <= heights.length <= 10^5 * 0 <= heights[
树 二叉树的右视图 给定一个二叉树的根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入:root = [1,2,3,null,5,null,4] 输出:[1,3,4] 示例 2: 输入:root = [1,2,3,4,null,null,null,5] 输出:[1,3,4,5] 示例 3: 输入:root = [1,null,3] 输出:[1,3] 示例 4: 输入:
栈 每日温度 给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 表示对于第 i 天,下一个更高温度出现在几天后。 如果气温在这之后都不会升高,请在该位置用 0 代替。 示例 1: 输入:temperatures = [73,74,75,71,69,72,76,73] 输出:[1,1,4,2,1,1,0,0] 示例 2: 输入:temperatures = [30,40,50,60] 输出:[1,1,1,0]
树 二叉搜索树中第 K 小的元素 给定一个二叉搜索树的根节点 root,和一个整数 k,请你设计一个算法查找其中第 k 小的元素。 k 从 1 开始计数。 示例 1: 输入:root = [3,1,4,null,2], k = 1 输出:1 示例 2: 输入:root = [5,3,6,2,4,null,null,1], k = 3 输出:3 提示: * 树中的节点数为 n * 1 <= k <= n <= 10^