LeetCode每日一题
LeetCode每日一题 题解 Java
xiaoxiawancsdn
这个作者很懒,什么都没留下…
展开
-
【动态规划】LeetCode-62. 不同路径
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]我们令 dp[i][j] 是到达 i, j 最多路径。问总共有多少条不同的路径?原创 2024-01-26 17:23:08 · 413 阅读 · 0 评论 -
【动态规划】LeetCode-42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。时间复杂度:O(n)空间复杂度:O(n)原创 2024-01-12 15:42:34 · 542 阅读 · 0 评论 -
【栈】LeetCode-32. 最长有效括号
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。时间复杂度:O(n)空间复杂度:O(n)原创 2024-01-04 08:38:17 · 511 阅读 · 1 评论 -
【动态规划】LeetCode-10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。时间复杂度:O(mn)空间复杂度:O(mn)原创 2024-01-03 15:01:25 · 503 阅读 · 0 评论 -
【字典树Trie】LeetCode-208. 实现 Trie (前缀树)
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);空间复杂度:O(T * Σ) 其中 ∣T∣ 为所有插入字符串的长度之和,Σ 为字符集的大小,本题 Σ=26。void insert(String word) 向前缀树中插入字符串 word。Trie() 初始化前缀树对象。原创 2024-01-02 15:47:33 · 770 阅读 · 0 评论 -
【字典树Trie】LeetCode-139. 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。时间复杂度:O(n2)空间复杂度:O(n)原创 2024-01-02 14:34:36 · 561 阅读 · 0 评论 -
【Manacher】LeetCode-5. 最长回文子串
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。给你一个字符串 s,找到 s 中最长的回文子串。数据范围比较小可以直接用迭代。时间复杂度:O(n2)空间复杂度:O(1)原创 2024-01-02 10:29:42 · 554 阅读 · 0 评论 -
【Manacher】LeetCode-647. 回文子串
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。子字符串 是字符串中的由连续字符组成的一个序列。回文字符串 是正着读和倒过来读一样的字符串。数据范围比较小可以直接用迭代。时间复杂度:O(n2)空间复杂度:O(1)原创 2024-01-02 09:39:02 · 330 阅读 · 0 评论 -
【排序算法】LeetCode-347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。时间复杂度:O(nlogk)空间复杂度:O(n)原创 2024-01-02 09:32:34 · 461 阅读 · 0 评论 -
【递归 &回溯】LeetCode-301. 删除无效的括号
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按 任意顺序 返回。时间复杂度:O(2^n * n)满足有效括号序列的性质。空间复杂度:O(n)原创 2023-12-28 13:41:29 · 495 阅读 · 0 评论 -
【排序算法】LeetCode-215. 数组中的第K个最大元素
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。时间复杂度:O(nlogn)快选 – 快排 + 选择。空间复杂度:O(1)原创 2023-12-28 13:35:53 · 379 阅读 · 0 评论 -
【排序算法】LeetCode-56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。时间复杂度:O(nlogn)空间复杂度:O(n)原创 2023-12-28 11:01:15 · 841 阅读 · 0 评论 -
【分治】53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。时间复杂度:O(n)空间复杂度:O(1)原创 2023-12-27 09:16:05 · 397 阅读 · 0 评论 -
【深度优先搜索 DFS】236. 二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。直接拿本身这个函数进行递归,本身这个函数的含义是在root这棵树找到p和q的最近公共祖先。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。时间复杂度:O(n)空间复杂度:O(n)原创 2023-12-21 10:11:34 · 354 阅读 · 0 评论 -
【宽度优先搜索 BFS】LeetCode-200. 岛屿数量
用dfs枚举整个地图,若当前位置是 1,则把这个位置赋值为 0,然后遍历上下左右四个方向,将所有为1的地方赋值为 0,当这块岛屿已经遍历完,则 答案加1。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。时间复杂度:O(nm)空间复杂度:O(nm)原创 2023-12-21 09:34:05 · 358 阅读 · 0 评论 -
【宽度优先搜索 BFS】LeetCode-617. 合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。给你两棵二叉树: root1 和 root2。注意: 合并过程必须从两个树的根节点开始。时间复杂度:O(n + m)返回合并后的二叉树。空间复杂度:O(1)原创 2023-12-21 08:59:06 · 336 阅读 · 0 评论 -
【递归 &回溯】LeetCode-226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。每次递归交换左右子树即可。遇到空节点返回空节点。时间复杂度:O(n)空间复杂度:O(n)原创 2023-12-20 15:14:56 · 426 阅读 · 0 评论 -
【递归 &回溯】LeetCode-79. 单词搜索
从单词矩阵中枚举每个单词的起点,从该起点出发往四周dfs搜索目标单词,并记录当前枚举到第几个单词,若当前搜索到的位置(i,j)的元素恰好是word单词第depth个字符,则继续dfs搜索,直到depth到最后一个字符则表示有了符合的方案,返回true。给定一个 m x n 二维字符网格 board 和一个字符串单词 word。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。注意:搜索过的位置继续搜索下一层时,需要对当前位置进行标识,表示已经搜索。原创 2023-12-20 10:50:19 · 417 阅读 · 0 评论 -
【递归 &回溯】LeetCode-39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。递归枚举,依次以每个点为起点枚举,每个点可以有一个或者多个,直到和大于等于target返回。对于给定的输入,保证和为 target 的不同组合数少于 150 个。空间复杂度:O(target)原创 2023-12-20 10:24:00 · 381 阅读 · 0 评论 -
【递归 &回溯】LeetCode-22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。时间复杂度:O(Cn/2n)空间复杂度:O(m + n)满足有效括号序列的性质。原创 2023-12-20 10:00:10 · 369 阅读 · 0 评论 -
【递归 &回溯】LeetCode-17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。时间复杂度:O(3^m * 4^n)空间复杂度:O(m + n)原创 2023-12-20 09:46:25 · 430 阅读 · 0 评论 -
【二分】LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0输出:[-1,-1]原创 2023-12-20 09:29:42 · 357 阅读 · 0 评论 -
【递归 &回溯】LeetCode-78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。由于每个数有选和不选两种情况,因此总共有。表示所有的情况,在某种情况。时间复杂度:O(2^n)空间复杂度:O(n)原创 2023-12-19 18:07:56 · 379 阅读 · 0 评论 -
【贪心】LeetCode-33. 搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2023-12-19 18:08:40 · 396 阅读 · 0 评论 -
【递归 &回溯】LeetCode-46. 全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。时间复杂度:O(n * n!空间复杂度:O(n2)(DFS + 回溯)原创 2023-12-19 17:25:01 · 432 阅读 · 0 评论 -
【贪心】LeetCode-33. 搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2023-12-19 15:49:17 · 378 阅读 · 0 评论 -
【贪心】LeetCode-406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。空间复杂度:O(logn)时间复杂度:O(n2)原创 2023-12-15 16:15:52 · 96 阅读 · 0 评论 -
【贪心】LeetCode-309. 买卖股票的最佳时机含冷冻期
设计一个算法计算出最大利润。给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。时间复杂度:O(n)空间复杂度:O(1)原创 2023-12-15 10:52:24 · 37 阅读 · 0 评论 -
【贪心】LeetCode-55. 跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。j 为最大能到达的值, 当i > j 代表i位置不可达 返回false。时间复杂度:O(n)空间复杂度:O(1)原创 2023-12-14 17:14:23 · 135 阅读 · 0 评论 -
【贪心】LeetCode-122. 买卖股票的最佳时机 II
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。转换思路 i买 j 卖 等价于 i - j 每一天都买卖,那只需要每一天都操作并且是正收益的相加即为最大收益。给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。返回 你能获得的 最大 利润。时间复杂度:O(n)空间复杂度:O(1)原创 2023-12-14 16:52:08 · 70 阅读 · 0 评论 -
【贪心】LeetCode-714. 买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。返回获得利润的最大值。时间复杂度:O(n)空间复杂度:O(n)原创 2023-12-14 16:31:09 · 51 阅读 · 0 评论 -
【贪心】LeetCode-11. 盛最多水的容器
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。时间复杂度:O(n)空间复杂度:O(1)原创 2023-12-11 16:24:45 · 99 阅读 · 0 评论 -
【模拟】LeetCode-48. 旋转图像
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。先主对角线翻转 再水平翻转。时间复杂度:O(n2)空间复杂度:O(n)原创 2023-12-11 15:17:26 · 134 阅读 · 0 评论 -
【二叉树】LeetCode-98. 验证二叉搜索树
设计一个递归函数 helper(root, lower, upper) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r)(l,r)(l,r) 的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r)(l,r)(l,r) 的范围内说明不满足条件直接返回,否则我们要继续递归调用检查它的左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。时间复杂度:O(n)空间复杂度:O(n)原创 2023-11-30 15:29:08 · 38 阅读 · 0 评论 -
【二叉树】LeetCode-96. 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则。当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则。综合两个公式可以得到 卡特兰数 公式。时间复杂度:O(n2)空间复杂度:O(n)原创 2023-11-29 16:30:03 · 51 阅读 · 0 评论 -
【二叉树】LeetCode-114. 二叉树的直径
单次执行流程中,先递归处理当前节点 u 的左右节点,得到左右子树为根时的“往下”最大路径 l 和 r,两者中的较大值 +1 即是本次执行流程的返回值(+1 的含义是在子路径基础上增加当前节点)。设计用于遍历二叉树的 DFS 函数:函数传入当前节点 u,返回以该节点为根时,方向“往下”的最大路径节点数量(注意这里是点数,而不是题目要求的边数)。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。同时,l + r 则是以当前节点 u 为路径最高点时的路径长度,用此更新全局 ans 即可。原创 2023-11-29 11:10:38 · 47 阅读 · 0 评论 -
【二叉树】LeetCode-114. 二叉树展开为链表
你可以使用原地算法(O(1) 额外空间)展开这棵树吗?时间复杂度:O(n)空间复杂度:O(1)原创 2023-11-22 10:01:11 · 33 阅读 · 0 评论 -
【二叉树】LeetCode-101. 对称二叉树
第一颗子树的左子树和第二颗子树的右子树互为镜像,且第一颗子树的右子树和第二颗子树的左子树互为镜像。给你一个二叉树的根节点 root , 检查它是否轴对称。递归算法很简单,你可以通过迭代算法完成吗?- 两个子树的根节点值相等;递归判断两个子树是否为镜像。时间复杂度:O(n)空间复杂度:O(n)原创 2023-11-21 11:04:11 · 96 阅读 · 0 评论 -
【哈希表】LeetCode-146. LRU 缓存
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value;LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。哈希表 + 双向链表。原创 2023-11-15 17:24:29 · 31 阅读 · 0 评论 -
【二叉树】LeetCode-94. 二叉树的中序遍历
递归的方法很容易实现,也很容易理解:先访问左子树,再访问根节点,再访问右子树,即 左->根->右。给定一个二叉树的根节点 root ,返回 它的 中序 遍历。递归算法很简单,你可以通过迭代算法完成吗?时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)原创 2023-11-15 17:19:18 · 35 阅读 · 0 评论