Leetcode-cn.com 2022-07-03
🟡 556.next-greater-element-iii
🏷️ Tags
#math #two_pointers #string
Description
给你一个正整数
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回
Example
🟡 556.next-greater-element-iii
🏷️ Tags
#math #two_pointers #string
Description
给你一个正整数
n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回
-1 。Example
输入:n = 12
输出:21
Leetcode-cn.com 2022-07-04
🟢 1200.minimum-absolute-difference
🏷️ Tags
#array #sorting
Description
给你个整数数组
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
Example
🟢 1200.minimum-absolute-difference
🏷️ Tags
#array #sorting
Description
给你个整数数组
arr,其中每个元素都 不相同。请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
Example
输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
Leetcode-cn.com 2022-07-05
🟡 729.my-calendar-i
🏷️ Tags
#design #segment_tree #binary_search #ordered_set
Description
实现一个
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。
日程可以用一对整数
实现
Example
🟡 729.my-calendar-i
🏷️ Tags
#design #segment_tree #binary_search #ordered_set
Description
实现一个
MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。
日程可以用一对整数
start 和 end 表示,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end 。实现
MyCalendar 类:MyCalendar() 初始化日历对象。boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历中。Example
输入:
["MyCalendar", "book", "book", "book"]
[[], [10, 20], [15, 25], [20, 30]]
输出:
[null, true, false, true]
解释:
MyCalendar myCalendar = new MyCalendar();
myCalendar.book(10, 20); // return True
myCalendar.book(15, 25); // return False ,这个日程安排不能添加到日历中,因为时间 15 已经被另一个日程安排预订了。
myCalendar.book(20, 30); // return True ,这个日程安排可以添加到日历中,因为第一个日程安排预订的每个时间都小于 20 ,且不包含时间 20 。
Leetcode-cn.com 2022-07-06
🔴 736.parse-lisp-expression
🏷️ Tags
#stack #recursion #hash_table #string
Description
给你一个类似 Lisp 语句的字符串表达式
表达式语法如下所示:
表达式可以为整数,let 表达式,add 表达式,mult 表达式,或赋值的变量。表达式的结果总是一个整数。
(整数可以是正整数、负整数、0)
let 表达式采用
add 表达式表示为
mult 表达式表示为
在该题目中,变量名以小写字符开始,之后跟随 0 个或多个小写字符或数字。为了方便,
最后,要说一下作用域的概念。计算变量名所对应的表达式时,在计算上下文中,首先检查最内层作用域(按括号计),然后按顺序依次检查外部作用域。测试用例中每一个表达式都是合法的。有关作用域的更多详细信息,请参阅Example
🔴 736.parse-lisp-expression
🏷️ Tags
#stack #recursion #hash_table #string
Description
给你一个类似 Lisp 语句的字符串表达式
expression,求出其计算结果。表达式语法如下所示:
表达式可以为整数,let 表达式,add 表达式,mult 表达式,或赋值的变量。表达式的结果总是一个整数。
(整数可以是正整数、负整数、0)
let 表达式采用
"(let v1 e1 v2 e2 ... vn en expr)" 的形式,其中 let 总是以字符串 "let"来表示,接下来会跟随一对或多对交替的变量和表达式,也就是说,第一个变量 v1被分配为表达式 e1 的值,第二个变量 v2 被分配为表达式 e2 的值,依次类推;最终 let 表达式的值为 expr表达式的值。add 表达式表示为
"(add e1 e2)" ,其中 add 总是以字符串 "add" 来表示,该表达式总是包含两个表达式 e1、e2 ,最终结果是 e1 表达式的值与 e2 表达式的值之 和 。mult 表达式表示为
"(mult e1 e2)" ,其中 mult 总是以字符串 "mult" 表示,该表达式总是包含两个表达式 e1、e2,最终结果是 e1 表达式的值与 e2 表达式的值之 积 。在该题目中,变量名以小写字符开始,之后跟随 0 个或多个小写字符或数字。为了方便,
"add" ,"let" ,"mult" 会被定义为 "关键字" ,不会用作变量名。最后,要说一下作用域的概念。计算变量名所对应的表达式时,在计算上下文中,首先检查最内层作用域(按括号计),然后按顺序依次检查外部作用域。测试用例中每一个表达式都是合法的。有关作用域的更多详细信息,请参阅Example
输入:expression = "(let x 2 (mult x (let x 3 y 4 (add x y))))"
输出:14
解释:
计算表达式 (add x y), 在检查变量 x 值时,
在变量的上下文中由最内层作用域依次向外检查。
首先找到 x = 3, 所以此处的 x 值是 3 。
Leetcode-cn.com 2022-07-07
🟡 648.replace-words
🏷️ Tags
#trie #array #hash_table #string
Description
在英语中,我们有一个叫做
现在,给定一个由许多词根组成的词典
你需要输出替换之后的句子。
Example
🟡 648.replace-words
🏷️ Tags
#trie #array #hash_table #string
Description
在英语中,我们有一个叫做
词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。现在,给定一个由许多词根组成的词典
dictionary 和一个用空格分隔单词形成的句子 sentence。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。你需要输出替换之后的句子。
Example
输入:dictionary = ["cat","bat","rat"], sentence = "the cattle was rattled by the battery"
输出:"the cat was rat by the bat"
Leetcode-cn.com 2022-07-10
🔴 741.cherry-pickup
🏷️ Tags
#array #dynamic_programming #matrix
Description
一个N x N的网格
0 表示这个格子是空的,所以你可以穿过它。
1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。
-1 表示这个格子里有荆棘,挡着你的路。
你的任务是在遵守下列规则的情况下,尽可能的摘到最多樱桃:
从位置 (0, 0) 出发,最后到达 (N-1, N-1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为0或者1的格子);
当到达 (N-1, N-1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;
当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为0);
如果在 (0, 0) 和 (N-1, N-1) 之间不存在一条可经过的路径,则没有任何一个樱桃能被摘到。
Example
🔴 741.cherry-pickup
🏷️ Tags
#array #dynamic_programming #matrix
Description
一个N x N的网格
(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示:0 表示这个格子是空的,所以你可以穿过它。
1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。
-1 表示这个格子里有荆棘,挡着你的路。
你的任务是在遵守下列规则的情况下,尽可能的摘到最多樱桃:
从位置 (0, 0) 出发,最后到达 (N-1, N-1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为0或者1的格子);
当到达 (N-1, N-1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;
当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为0);
如果在 (0, 0) 和 (N-1, N-1) 之间不存在一条可经过的路径,则没有任何一个樱桃能被摘到。
Example
输入: grid =
[[0, 1, -1],
[1, 0, -1],
[1, 1, 1]]
输出: 5
解释:
玩家从(0,0)点出发,经过了向下走,向下走,向右走,向右走,到达了点(2, 2)。
在这趟单程中,总共摘到了4颗樱桃,矩阵变成了[[0,1,-1],[0,0,-1],[0,0,0]]。
接着,这名玩家向左走,向上走,向上走,向左走,返回了起始点,又摘到了1颗樱桃。
在旅程中,总共摘到了5颗樱桃,这是可以摘到的最大值了。
Leetcode-cn.com 2022-07-12
🟢 1252.cells-with-odd-values-in-a-matrix
🏷️ Tags
#array #math #simulation
Description
给你一个
另有一个二维索引数组
对
给你
Example
🟢 1252.cells-with-odd-values-in-a-matrix
🏷️ Tags
#array #math #simulation
Description
给你一个
m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。另有一个二维索引数组
indices,indices[i] = [ri, ci] 指向矩阵中的某个位置,其中 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。对
indices[i] 所指向的每个位置,应同时执行下述增量操作:ri 行上的所有单元格,加 1 。ci 列上的所有单元格,加 1 。给你
m、n 和 indices 。请你在执行完所有 indices 指定的增量操作后,返回矩阵中 奇数值单元格 的数目。Example
输入:m = 2, n = 3, indices = [[0,1],[1,1]]
输出:6
解释:最开始的矩阵是 [[0,0,0],[0,0,0]]。
第一次增量操作后得到 [[1,2,1],[0,1,0]]。
最后的矩阵是 [[1,3,1],[1,3,1]],里面有 6 个奇数。
Leetcode-cn.com 2022-07-13
🟡 735.asteroid-collision
🏷️ Tags
#stack #array
Description
给定一个整数数组
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
Example
🟡 735.asteroid-collision
🏷️ Tags
#stack #array
Description
给定一个整数数组
asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
Example
输入:asteroids = [5,10,-5]
输出:[5,10]
解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。
Leetcode-cn.com 2022-07-14
🔴 745.prefix-and-suffix-search
🏷️ Tags
#design #trie #string
Description
设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。
实现
Example
🔴 745.prefix-and-suffix-search
🏷️ Tags
#design #trie #string
Description
设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。
实现
WordFilter 类:WordFilter(string[] words) 使用词典中的单词 words 初始化对象。f(string pref, string suff) 返回词典中具有前缀 prefix 和后缀 suff 的单词的下标。如果存在不止一个满足要求的下标,返回其中 最大的下标 。如果不存在这样的单词,返回 -1 。Example
输入
["WordFilter", "f"]
[[["apple"]], ["a", "e"]]
输出
[null, 0]
解释
WordFilter wordFilter = new WordFilter(["apple"]);
wordFilter.f("a", "e"); // 返回 0 ,因为下标为 0 的单词:前缀 prefix = "a" 且 后缀 suff = "e" 。
Leetcode-cn.com 2022-07-15
🟡 558.logical-or-of-two-binary-grids-represented-as-quad-trees
🏷️ Tags
#tree #divide_and_conquer
Description
二进制矩阵中的所有元素不是 0 就是 1 。
给你两个四叉树,
请你返回一个表示
注意,当
四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:
我们可以按以下步骤为二维区域构建四叉树:
如果当前网格的值相同(即,全为
如果当前网格的值不同,将
使用适当的子网格递归每个子节点。
如果你想了解更多关于四叉树的内容,可以参考 wiki 。
四叉树格式:
输出为使用层序遍历后四叉树的序列化形式,其中
它与二叉树的序列化非常相似。唯一的区别是节点以列表形式表示
如果
Example
🟡 558.logical-or-of-two-binary-grids-represented-as-quad-trees
🏷️ Tags
#tree #divide_and_conquer
Description
二进制矩阵中的所有元素不是 0 就是 1 。
给你两个四叉树,
quadTree1 和 quadTree2。其中 quadTree1 表示一个 n * n 二进制矩阵,而 quadTree2 表示另一个 n * n 二进制矩阵。请你返回一个表示
n * n 二进制矩阵的四叉树,它是 quadTree1 和 quadTree2 所表示的两个二进制矩阵进行 按位逻辑或运算 的结果。注意,当
isLeaf 为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受 。四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:
val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False;isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。
class Node {
public boolean val;
public boolean isLeaf;
public Node topLeft;
public Node topRight;
public Node bottomLeft;
public Node bottomRight;
}
我们可以按以下步骤为二维区域构建四叉树:
如果当前网格的值相同(即,全为
0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。如果当前网格的值不同,将
isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。使用适当的子网格递归每个子节点。
如果你想了解更多关于四叉树的内容,可以参考 wiki 。
四叉树格式:
输出为使用层序遍历后四叉树的序列化形式,其中
null 表示路径终止符,其下面不存在节点。它与二叉树的序列化非常相似。唯一的区别是节点以列表形式表示
[isLeaf, val] 。如果
isLeaf 或者 val 的值为 True ,则表示它在列表 [isLeaf, val] 中的值为 1 ;如果 isLeaf 或者 val 的值为 False ,则表示值为 0 。Example
输入:quadTree1 = [[0,1],[1,1],[1,1],[1,0],[1,0]]
, quadTree2 = [[0,1],[1,1],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
输出:[[0,0],[1,1],[1,1],[1,1],[1,0]]
解释:quadTree1 和 quadTree2 如上所示。由四叉树所表示的二进制矩阵也已经给出。
如果我们对这两个矩阵进行按位逻辑或运算,则可以得到下面的二进制矩阵,由一个作为结果的四叉树表示。
注意,我们展示的二进制矩阵仅仅是为了更好地说明题意,你无需构造二进制矩阵来获得结果四叉树。
236.lowest-common-ancestor-of-a-binary-tree.pdf
66.1 KB
Leetcode.com 2022-07-26
🟡236.lowest-common-ancestor-of-a-binary-tree
🏷️ Tags
#tree #depth_first_search #binary_tree
🟡236.lowest-common-ancestor-of-a-binary-tree
🏷️ Tags
#tree #depth_first_search #binary_tree
114.flatten-binary-tree-to-linked-list.pdf
84.9 KB
Leetcode.com 2022-07-27
🟡114.flatten-binary-tree-to-linked-list
🏷️ Tags
#linked_list #stack #tree #depth_first_search #binary_tree
🟡114.flatten-binary-tree-to-linked-list
🏷️ Tags
#linked_list #stack #tree #depth_first_search #binary_tree