算法

A collection of 99 posts
算法

组合总和

给你一个无重复元素的整数数组 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,
6 min read

实现 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。 示例: 输入
8 min read

课程表

你这个学期必须选修 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
8 min read
算法

腐烂的橘子

在给定的 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
6 min read

二叉树中的最大路径和

二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。 同一个节点在一条路径序列中至多出现一次。 该路径至少包含一个节点,且不一定经过根节点。 路径和是路径中各节点值的总和。 给你一个二叉树的根节点 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,
9 min read
队列

二叉树的最近公共祖先

给定一个二叉树,找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为: 对于有根树 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: 输入:
11 min read
算法

在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 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
8 min read

路径总和 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,
12 min read
二分查找

搜索二维矩阵

给你一个满足下述两条属性的 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,
9 min read
算法

从前序与中序遍历序列构造二叉树

给定两个整数数组 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]
9 min read

展开二叉树

给你二叉树的根节点 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,
11 min read

柱状图中最大的矩形

给定 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[
10 min read