
leetcode
文章平均质量分 54
进击的代码家
这个作者很懒,什么都没留下…
展开
-
leetcode刷题(134)——剑指 Offer 33. 二叉搜索树的后序遍历序列
划分左右子树: 遍历后序遍历的 [i, j]区间元素,寻找 第一个大于根节点 的节点,索引记为 m。此时,可划分出左子树区间 [i,m-1]、右子树区间 [m, j - 1]、根节点索引 j。右子树区间 [m, j-1]内的所有节点都应 >postorder[j]。根据二叉搜索树的定义,可以通过递归,判断所有子树的 正确性 (即其后序遍历是否满足二叉搜索树的定义) ,若所有子树都正确,则此序列为二叉搜索树的后序遍历。recur(m, j - 1) : 判断 此树的右子树 是否正确。原创 2022-11-29 09:55:24 · 126 阅读 · 0 评论 -
leetcode刷题(133)——剑指 Offer 07. 重建二叉树
递归共建立 N个节点,每层递归中的节点建立、搜索操作占用 O(1) ,因此使用 O(N)时间。递推参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right;在中序遍历中搜索根节点 node 的索引 ,可将 中序遍历 划分为 [ 左子树 | 根节点 | 右子树 ]。根据中序遍历中的左(右)子树的节点数量,可将 前序遍历 划分为 [ 根节点 | 左子树 | 右子树 ]。输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。原创 2022-11-25 10:25:52 · 469 阅读 · 0 评论 -
leetcode刷题(132)——完全背包问题思路理解
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以这里还是以纯完全背包问题进行讲解理论和原理。对照01背包的代码,就是将第二个循环从小到大进行枚举即可。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。版本1:这是朴素版本的,时间复杂度O(nm^2)原创 2022-11-18 10:15:53 · 505 阅读 · 0 评论 -
leetcode刷题(131)——背包问题理解
面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。原创 2022-11-15 11:36:49 · 367 阅读 · 0 评论 -
leetcode刷题(130)——最大得分的路径数目
给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。一条路径的 「得分」 定义为:路径上所有数字的和。请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。原创 2022-11-10 14:41:31 · 451 阅读 · 0 评论 -
leetcode刷题(129)——576. 出界的路径数
给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn]。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。原创 2022-11-08 20:50:47 · 414 阅读 · 0 评论 -
leetcode刷题(128)——1575. 统计所有可行路径,动态规划解法
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量每一步中,如果你在城市 i ,你可以选择任意一个城市 j ,满足 j!= i 且 0原创 2022-11-08 15:43:29 · 384 阅读 · 0 评论 -
leetcode刷题(127)——1575. 统计所有可行路径,DFS解法
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量每一步中,如果你在城市 i ,你可以选择任意一个城市 j ,满足 j!= i 且 0原创 2022-11-07 21:18:53 · 377 阅读 · 0 评论 -
leetcode刷题(126)——1289. 下降路径最小和 II
给你一个 n x n 整数矩阵 arr ,请你返回 非零偏移下降路径 数字和的最小值。非零偏移下降路径 定义为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。原创 2022-11-06 16:50:28 · 408 阅读 · 0 评论 -
leetcode刷题(125)——931. 下降路径最小和
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1)。原创 2022-11-06 12:28:20 · 258 阅读 · 0 评论 -
leetcode刷题(124)——64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。原创 2022-11-05 22:00:24 · 187 阅读 · 0 评论 -
leetcode刷题(123)——63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。提示:obstacleGrid[i][j] 为 0 或 1。原创 2022-11-05 21:25:13 · 157 阅读 · 0 评论 -
leetcode刷题(122)——62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?提示:题目数据保证答案小于等于 2 * 109。原创 2022-11-05 20:45:19 · 545 阅读 · 0 评论 -
leetcode刷题(121)——1143. 最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = "abcde", text2 = "ace"原创 2021-02-20 11:02:05 · 274 阅读 · 0 评论 -
leetcode刷题(120)——59.螺旋矩阵
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1输出:[[1]]题解class Solution { public int[][] generateMatrix(int n) { int l = 0, r = n - 1, t = 0, b = n - 1;原创 2021-02-17 12:22:48 · 175 阅读 · 0 评论 -
leetcode刷题(119)——54.螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]按照顺时针的顺序访问二维数组,通过while循环,跳出条件就是访问的数量和二维数组里所有元素的总和一致原创 2021-02-17 12:06:30 · 298 阅读 · 0 评论 -
leetcode刷题(118)——除自身以外数组的乘积
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。题解:我们不必将所有数字的乘积除以给定索引处的数字得到相应的答案,而是利用索引左侧所有原创 2021-02-17 11:44:36 · 253 阅读 · 0 评论 -
leetcode刷题(117)——557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:输入:"Let's take LeetCode contest"输出:"s'teL ekat edoCteeL tsetnoc"提示:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能原创 2021-02-16 17:44:24 · 231 阅读 · 0 评论 -
leetcode刷题(116)——反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]非常简单原创 2021-02-16 16:33:27 · 143 阅读 · 0 评论 -
leetcode刷题(115)——剑指 Offer 67. 把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一个非空原创 2021-02-16 15:13:04 · 191 阅读 · 1 评论 -
leetcode刷题(114)——4. 寻找两个正序数组的中位数
给定两个大小为 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] ,中位数 (2 + 3) /原创 2021-02-16 11:37:37 · 194 阅读 · 0 评论 -
leetcode刷题(113)——241. 为运算表达式设计优先级
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) =原创 2021-02-09 16:27:37 · 363 阅读 · 0 评论 -
leetcode刷题(112)——560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。关键是,如何快速得到某个子数组的和呢,比如说给你一个数组nums,让你实现一个接口sum(i, j),这个接口要返回nums[i…j]的和,而且会被多次调用,你怎么实现这个接口呢?因为接口要被多次调用,显然不能每次都去遍历nums[i…j],有没有一种快速的方法在 O(1) 时间内算出nums[i原创 2021-02-08 22:19:26 · 329 阅读 · 0 评论 -
leetcode刷题(111)——1109. 航班预订统计
这里有 n 个航班,它们分别从 1 到 n 进行编号。我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [j, k, l] 意味着我们在从 j 到 k 的每个航班上预订了 l 个座位。请你返回一个长度为 n 的数组 answer,按航班编号顺序返回每个航班上预订的座位数。示例:输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5输出:[10,55,45,25,25]可以使用差分数组,差分数组的主要适用场景是频繁对原始数组原创 2021-02-08 21:01:35 · 348 阅读 · 0 评论 -
leetcode刷题(110)——752. 打开转盘锁
你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以解锁的数字,你原创 2021-02-08 19:42:50 · 178 阅读 · 0 评论 -
leetcode刷题(109)——283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。仍然使用快慢指针,然后将所有的0放置在最后即可class Solution { public void moveZeroes(int[] nums) { int slow = 0; int fast = 0; i原创 2021-02-07 21:09:31 · 188 阅读 · 0 评论 -
leetcode刷题(108)——83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3其实和数组去重是一模一样的,唯一的区别是把数组赋值操作变成操作指针而已,所以同样是:class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == nu原创 2021-02-07 19:03:50 · 159 阅读 · 0 评论 -
leetcode刷题(107)——26. 删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组原创 2021-02-07 12:41:08 · 186 阅读 · 1 评论 -
leetcode刷题(106)——316. 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例 1:输入:s = "bcabc"输出:"abc"示例 2:输入:s = "cbacdcbc"输出:"acdb"要求一、要去重。要求二、去重字符串中的字符顺序不能打乱s中字符出现的相对顺序。要求三、在所有符合上一条要求的去重字符串中,字典序最小的作为最终结果。我们先暂时忽略要求三,用「栈」来实现一下要求一和要求二,至于为什么用栈来实现,后面你就原创 2021-02-07 12:22:44 · 1420 阅读 · 0 评论 -
leetcode刷题(105)——710. 黑名单中的随机数
给定一个包含 [0,n ) 中独特的整数的黑名单 B,写一个函数从 [ 0,n ) 中返回一个不在 B 中的随机整数。对它进行优化使其尽量少调用系统方法 Math.random() 。提示:1 <= N <= 10000000000 <= B.length < min(100000, N)[0, N) 不包含 N,详细参见 interval notation 。示例 1:输入: ["Solution","pick","pick","pick"][[1,[]],[],原创 2021-02-07 11:10:31 · 242 阅读 · 0 评论 -
leetcode刷题(104)——380. 常数时间插入、删除和获取随机元素
设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。insert(val):当元素 val 不存在时,向集合中插入该项。remove(val):元素 val 存在时,从集合中移除该项。getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。// 初始化一个空的集合。RandomizedSet randomSet = new RandomizedSet();// 向集合中插入 1 。返回 true 表示 1 被成功地插入。randomSet.insert(原创 2021-02-06 21:14:04 · 337 阅读 · 0 评论 -
leetcode刷题(103)——503. 下一个更大元素 II
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。注意: 输入数组的长度不会超过 10000。比如输入一个数原创 2021-02-02 15:15:24 · 221 阅读 · 0 评论 -
leetcode刷题(102)——496.下一个更大元素
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释: 对于 num1 中的数字 4 ,你无法在第二个数组中找到原创 2021-02-01 11:36:47 · 378 阅读 · 0 评论 -
leetcode刷题(100)——232. 用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和原创 2021-01-20 19:32:15 · 244 阅读 · 0 评论 -
leetcode刷题(99)——225. 用队列实现栈
使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你可以假设所有操作都是有效的(例如, 对一个空的栈不原创 2021-01-20 18:21:02 · 151 阅读 · 1 评论 -
leetcode刷题(98)——652. 寻找重复的子树
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4下面是两个重复的子树: 2 / 4和 4因此,你需要以列表的形式返回上述重复子树的根结点。/** * Definition for a binary tree node原创 2021-01-04 21:40:52 · 190 阅读 · 0 评论 -
leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7看下后序和中序遍历的框架:void traverse(TreeNode root) { traverse(root.left); traverse(root.right);原创 2021-01-04 21:16:43 · 191 阅读 · 0 评论 -
leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 71.先回顾前序遍历和中序遍历的框架:void traverse(TreeNode root) { // 前序遍历 preorder.add(root.val); trave原创 2021-01-04 20:55:37 · 213 阅读 · 0 评论 -
leetcode刷题(96)——116. 填充每个节点的下一个右侧节点指针
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做原创 2020-12-10 21:08:57 · 155 阅读 · 0 评论 -
leetcode刷题(95)——416. 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.此题目属于背包问题:首先回忆一下背包问题大致的描述是什么:给你一个可装载重量为 W 的背包和原创 2020-08-26 19:54:30 · 1655 阅读 · 0 评论