给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围
[−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
示例 2:
示例 3:
示例 4:
提示:
Code1
240727
Code2
240727
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s)
的算法如下:
- 空格:读入字符串并丢弃无用的前导空格(
" "
)
- 符号:检查下一个字符(假设还未到字符末尾)为
'-'
还是
'+'
。如果两者都不存在,则假定结果为正。
- 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- 舍入:如果整数数超过 32 位有符号整数范围
[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于
−231
的整数应该被舍入为 −231
,大于
231 − 1
的整数应该被舍入为 231 − 1
。
返回整数作为最终结果。
示例 1:
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
示例 2:
输入:s = " -042"
输出:-42
解释:
示例 3:
输入:s = "1337c0d3"
输出:1337
解释:
示例 4:
输入:s = "0-1"
输出:0
解释:
示例 5:
输入:s = "words and 987"
输出:0
解释:
读取在第一个非数字字符“w”处停止。
提示:
0 <= s.length <= 200
s
由英文字母(大写和小写)、数字(0-9
)、' '
、'+'
、'-'
和 '.'
组成
Code
240806
写这个逻辑好麻烦。补充点测试样例。
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
示例 2:
示例 3:
提示:
Code-cpp
240806
字符串做法
纯数字做法
给你一个字符串 s
和一个字符规律
p
,请你来实现一个支持 '.'
和 '*'
的正则表达式匹配。
'.'
匹配任意单个字符
'*'
匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s
的,而不是部分字符串。
示例 1:
示例 2:
示例 3:
提示:
1 <= s.length <= 20
1 <= p.length <= 20
s
只包含从 a-z
的小写字母。
p
只包含从 a-z
的小写字母,以及字符
.
和 *
。
- 保证每次出现字符
*
时,前面都匹配到有效的字符
Code-cpp-1
240807
632ms击败5.01%。时间感人。
测试样例
给定一个长度为 n
的整数数组 height
。有
n
条垂线,第 i
条线的两个端点是
(i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
示例 2:
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
Code-cpp
240808
时间复杂度\(O(NlogN)\)。
Code-cpp
240808
双指针法
七个不同的符号代表罗马数字,其值如下:
符号 |
值 |
I |
1 |
V |
5 |
X |
10 |
L |
50 |
C |
100 |
D |
500 |
M |
1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9
开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用
减法形式,表示从以下符号中减去一个符号,例如 4 是 5
(
V
) 减 1 (I
): IV
,9 是 10
(X
) 减 1
(I
):IX
。仅使用以下减法形式:4
(IV
),9 (IX
),40 (XL
),90
(XC
),400 (CD
) 和 900 (CM
)。
- 只有 10 的次方(
I
, X
, C
,
M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5
(V
),50 (L
) 或 500
(D
)。如果需要将符号附加4次,请使用
减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
示例 2:
输入:num = 58
输出:"LVIII"
解释:
示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
提示:
Code
240811
罗马数字包含以下七种字符: I
, V
,
X
, L
,C
,D
和
M
。
例如, 罗马数字 2
写做 II
,即为两个并列的
1 。12
写做 XII
,即为 X
+
II
。 27
写做 XXVII
, 即为
XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4
不写做 IIII
,而是 IV
。数字 1 在数字 5
的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9
表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在 V
(5) 和 X
(10)
的左边,来表示 4 和 9。
X
可以放在 L
(50) 和 C
(100)
的左边,来表示 40 和 90。
C
可以放在 D
(500) 和 M
(1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
1 <= s.length <= 15
s
仅含字符
('I', 'V', 'X', 'L', 'C', 'D', 'M')
- 题目数据保证
s
是一个有效的罗马数字,且表示整数在范围
[1, 3999]
内
- 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
- IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作
CMXCIX 。
- 关于罗马数字的详尽书写规则,可以参考 罗马数字 -
百度百科。
Code
240811
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
示例 2:
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
Code
240811
给你一个整数数组 nums
,判断是否存在三元组
[nums[i], nums[j], nums[k]]
满足
i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
示例 2:
示例 3:
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
Code
240811
给你一个长度为 n
的整数数组 nums
和
一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
示例 2:
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
Code
240812
Code2
240812
优化的写法
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按
任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1
不对应任何字母。
示例 1:
示例 2:
示例 3:
提示:
0 <= digits.length <= 4
digits[i]
是范围 ['2', '9']
的一个数字。
Code
240813
给你一个由 n
个整数组成的数组 nums
,和一个目标值 target
。请你找出并返回满足下述全部条件且不重复的四元组
[nums[a], nums[b], nums[c], nums[d]]
(若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a
、b
、c
和 d
互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
示例 2:
提示:
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
Code
240813
好麻烦啊,感觉比官方题解多了很多特判的地方。有个样例还卡io时间(还好把cout注释掉了)
样例:
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
示例 2:
示例 3:
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
进阶:你能尝试使用一趟扫描实现吗?
Code
240813
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
示例 2:
示例 3:
提示:
1 <= s.length <= 104
s
仅由括号 '()[]{}'
组成
Code
240813
将两个升序链表合并为一个新的 升序
链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
示例 2:
示例 3:
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和 l2
均按 非递减顺序
排列
Code
240814
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
示例 2:
示例 3:
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列
lists[i].length
的总和不超过 10^4
Code
240818
使用遍历,\(O(n^2)\)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
示例 2:
示例 3:
提示:
- 链表中节点的数目在范围
[0, 100]
内
0 <= Node.val <= 100
Code
240820
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是
k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
示例 2:
提示:
- 链表中的节点数目为
n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
进阶:你可以设计一个只用 O(1)
额外内存空间的算法解决此问题吗?
Code
240820
给你一个 非严格递增排列 的数组 nums
,请你原地
删除重复出现的元素,使每个元素 只出现一次
,返回删除后数组的新长度。元素的 相对顺序 应该保持
一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使 nums
的前
k
个元素包含唯一元素,并按照它们最初在 nums
中出现的顺序排列。nums
的其余元素与 nums
的大小不重要。
- 返回
k
。
判题标准:
系统会用下面的代码来测试你的题解:
如果所有断言都通过,那么您的题解将被 通过。
示例 1:
示例 2:
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 非严格递增 排列
Code
240905
简单
给你一个数组 nums
和一个值 val
,你需要
原地
移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与
val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为
k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使 nums
的前
k
个元素包含不等于 val
的元素。nums
的其余元素和 nums
的大小并不重要。
- 返回
k
。
用户评测:
评测机将使用以下代码测试您的解决方案:
如果所有的断言都通过,你的解决方案将会 通过。
示例 1:
示例 2:
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
Code
240905
简单
给你两个字符串 haystack
和 needle
,请你在
haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
示例 1:
示例 2:
提示:
1 <= haystack.length, needle.length <= 104
haystack
和 needle
仅由小写英文字符组成
Code
240905
中等
整数数组的一个 排列
就是将其所有成员以序列或线性顺序排列。
- 例如,
arr = [1,2,3]
,以下这些都可以视作
arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。
整数数组的 下一个排列
是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的
下一个排列就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如,
arr = [1,2,3]
的下一个排列是 [1,3,2]
。
- 类似地,
arr = [2,3,1]
的下一个排列是
[3,1,2]
。
- 而
arr = [3,2,1]
的下一个排列是 [1,2,3]
,因为 [3,2,1]
不存在一个字典序更大的排列。
给你一个整数数组 nums
,找出 nums
的下一个排列。
必须原地修改,只允许使用额外常数空间。
示例 1:
示例 2:
示例 3:
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
Code
240906
方法:以[1,3,4,2]
举例。从右到左,找到第一个变小的数对,即(3,4)
。将这个数对中右边的数标记为cur
,我们需要从cur
到数组末尾的这些数中找到,比cur-1
这个数大且最接近的数。然后我们交换这两个数,再将cur
到数组末尾用sort
函数从小到大排序即可。
中等
请你判断一个 9 x 9
的数独是否有效。只需要
根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。
- 数字
1-9
在每一列只能出现一次。
- 数字
1-9
在每一个以粗实线分隔的 3x3
宫内只能出现一次。(请参考示例图)
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'
表示。
示例 1:
示例 2:
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字(1-9
)或者
'.'
Code
240906
只要大暴力就好了,没有别的解法
中等
「外观数列」是一个数位字符串序列,由递归公式定义:
countAndSay(1) = "1"
countAndSay(n)
是 countAndSay(n-1)
的行程长度编码。
行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。例如,要压缩字符串
"3322251"
,我们将 "33"
用 "23"
替换,将 "222"
用 "32"
替换,将
"5"
用 "15"
替换并将 "1"
用
"11"
替换。因此压缩后字符串变为
"23321511"
。
给定一个整数 n
,返回 外观数列 的第
n
个元素。
示例 1:
输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = "1" 的行程长度编码 = "11"
countAndSay(3) = "11" 的行程长度编码 = "21"
countAndSay(4) = "21" 的行程长度编码 = "1211"
示例 2:
输入:n = 1
输出:"1"
解释:
这是基本情况。
提示:
进阶:你能迭代解决该问题吗?
Code
240907
解法:通过递归解决。
中等
给你一个 无重复元素 的整数数组
candidates
和一个目标整数 target
,找出
candidates
中可以使数字和为目标数 target
的
所有 不同组合 ,并以列表形式返回。你可以按
任意顺序 返回这些组合。
candidates
中的 同一个 数字可以
无限制重复被选取
。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target
的不同组合数少于
150
个。
示例 1:
示例 2:
示例 3:
提示:
1 <= candidates.length <= 30
2 <= candidates[i] <= 40
candidates
的所有元素 互不相同
1 <= target <= 40
Code
240908
经典的DP,但是下面的代码还没有优化为一维的。
中等
给定一个候选人编号的集合 candidates
和一个目标数
target
,找出 candidates
中所有可以使数字和为
target
的组合。
candidates
中的每个数字在每个组合中只能使用
一次 。
注意:解集不能包含重复的组合。
示例 1:
示例 2:
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
Code1
240909
没有去重的写法,答案错误。但是是一维DP
Code2
2409090
时间优化不够,因为是set
中等
给定两个以字符串形式表示的非负整数 num1
和
num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger
库或直接将输入转换为整数。
示例 1:
示例 2:
提示:
1 <= num1.length, num2.length <= 200
num1
和 num2
只能由数字组成。
num1
和 num2
都不包含任何前导零,除了数字0本身。
Code
240911
中等
给定一个长度为 n
的 0 索引整数数组
nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
示例 1:
示例 2:
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
- 题目保证可以到达
nums[n-1]
Code1
240912
简单题,直接遍历一遍即可?
Code2
240912
优化,每一跳计算能到的最小点和最大点。由于这个范围能覆盖(min,max)这个区间,所以只要最后一个点落在这个区间内,循环就结束。
中等
给定一个不含重复数字的数组 nums
,返回其
所有可能的全排列 。你可以 按任意顺序
返回答案。
示例 1:
示例 2:
示例 3:
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
Code1
240912
看完题解后非常愚蠢的做法。
中等
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
示例 2:
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
Code
240917
看了一部分题解自己又做了一点。
感觉被前面那题的思维限制住了。
中等
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地
旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要
使用另一个矩阵来旋转图像。
示例 1:
示例 2:
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
Code
240918
中等
给你一个字符串数组,请你将 字母异位词
组合在一起。可以按任意顺序返回结果列表。
字母异位词
是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
示例 2:
示例 3:
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
Code1
240920
最基本的遍历。但是效率很低。需要优化
Code2
240920
优化了一下,现在只要31ms了。上面的代码需要1s。
Code3
240920
现在21ms了,内存消耗22.18MB
中等
实现 pow(x,
n) ,即计算 x
的整数 n
次幂函数(即,xn
)。
示例 1:
示例 2:
示例 3:
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n
是一个整数
- 要么
x
不为零,要么 n > 0
。
-104 <= xn <= 104
Code
240921
快速幂
中等
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
示例 2:
示例 3:
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n)
的解法,尝试使用更为精妙的 分治法 求解。
Code
240922
DP
中等
给你一个 m
行 n
列的矩阵
matrix
,请按照 顺时针螺旋顺序
,返回矩阵中的所有元素。
示例 1:
示例 2:
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
Code
240923
中等
给你一个非负整数数组 nums
,你最初位于数组的
第一个下标
。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
示例 2:
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 105
Code
240924
中等
以数组 intervals
表示若干个区间的集合,其中单个区间为
intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回
一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
示例 2:
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
Code
240925
只能说速度非常慢。因为是O(n)的遍历。
很神奇的是,如果我把begin和Max的定义放在外面:
就会超时。不知道什么原因。
本来还想使用对分搜索优化,但是后面发现无论如何都需要排序,且扫描必须使用线性的。上面的解答的时间已经最优化了。
中等
给你一个 无重叠的
,按照区间起始端点排序的区间列表 intervals
,其中
intervals[i] = [starti, endi]
表示第 i
个区间的开始和结束,并且 intervals
按照 starti
升序排列。同样给定一个区间 newInterval = [start, end]
表示另一个区间的开始和结束。
在 intervals
中插入区间 newInterval
,使得
intervals
依然按照 starti
升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。
返回插入之后的 intervals
。
注意 你不需要原地修改
intervals
。你可以创建一个新数组然后返回它。
示例 1:
示例 2:
提示:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 105
intervals
根据 starti
按
升序 排列
newInterval.length == 2
0 <= start <= end <= 105
Code
240926
简单
给你一个字符串
s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中
最后一个 单词的长度。
单词
是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
示例 2:
示例 3:
提示:
1 <= s.length <= 104
s
仅有英文字母和空格 ' '
组成
s
中至少存在一个单词
Code
240927
中等
给你一个正整数 n
,生成一个包含 1
到
n2
所有元素,且元素按顺时针顺序螺旋排列的
n x n
正方形矩阵 matrix
。
示例 1:
示例 2:
提示:
Code
240927
中等
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
示例 2:
提示:
- 链表中节点的数目在范围
[0, 500]
内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
Code
240929
中等
一个机器人位于一个 m x n
网格的左上角
(起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为
“Finish” )。
问总共有多少条不同的路径?
示例 1:
示例 2:
示例 3:
示例 4:
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 109
Code
240929
中等
给定一个 m x n
的整数数组
grid
。一个机器人初始位于 左上角(即
grid[0][0]
)。机器人尝试移动到 右下角(即
grid[m - 1][n - 1]
)。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1
和 0
来表示。机器人的移动路径中不能包含 任何
有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109
。
示例 1:
示例 2:
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
为 0
或
1
Code
240929
中等
给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格
绝对路径 (以 '/'
开头),请你将其转化为
更加简洁的规范路径。
在 Unix 风格的文件系统中规则如下:
- 一个点
'.'
表示当前目录本身。
- 此外,两个点
'..'
表示将目录切换到上一级(指向父目录)。
- 任意多个连续的斜杠(即,
'//'
或
'///'
)都被视为单个斜杠 '/'
。
- 任何其他格式的点(例如,
'...'
或
'....'
)均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式:
- 始终以斜杠
'/'
开头。
- 两个目录名之间必须只有一个斜杠
'/'
。
- 最后一个目录名(如果存在)不能 以
'/'
结尾。
- 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'
或 '..'
)。
返回简化后得到的 规范路径 。
示例 1:
输入:path = "/home/"
输出:"/home"
解释:
应删除尾随斜杠。
示例 2:
输入:path = "/home//foo/"
输出:"/home/foo"
解释:
多个连续的斜杠被单个斜杠替换。
示例 3:
输入:path = "/home/user/Documents/../Pictures"
输出:"/home/user/Pictures"
解释:
两个点 ".."
表示上一级目录(父目录)。
示例 4:
输入:path = "/../"
输出:"/"
解释:
不可能从根目录上升一级目录。
示例 5:
输入:path = "/.../a/../b/c/../d/./"
输出:"/.../b/d"
解释:
"..."
在这个问题中是一个合法的目录名。
提示:
1 <= path.length <= 3000
path
由英文字母,数字,'.'
,'/'
或 '_'
组成。
path
是一个有效的 Unix 风格绝对路径。
Code
241007
中等
给定一个 *m* x *n*
的矩阵,如果一个元素为
0 ,则将其所在行和列的所有元素都设为 0
。请使用 原地
算法。
示例 1:
示例 2:
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
进阶:
- 一个直观的解决方案是使用
O(*m**n*)
的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用
O(*m* + *n*)
的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个仅使用常量空间的解决方案吗?
Code
241009
中等
给定一个包含红色、白色和蓝色、共 n
个元素的数组
nums
,原地
对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
示例 2:
提示:
n == nums.length
1 <= n <= 300
nums[i]
为 0
、1
或
2
进阶:
Code
241009
中等
给定两个整数 n
和 k
,返回范围
[1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
示例 2:
提示:
Code
241015
简单的递归。效率还挺高,时间103ms,击败90.56%。
但是如果在recursion函数的end、k参数上使用引用,就会使时间到达249ms,击败8.62%。非常神奇。
中等
给你一个整数数组 nums
,数组中的元素
互不相同 。返回该数组所有可能的子集(幂集)
解集 不能 包含重复的子集。你可以按
任意顺序 返回解集。
示例 1:
示例 2:
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
Code
241015
还是简单的递归。记得排序就好了。
中等
给定两个整数数组 preorder
和 inorder
,其中
preorder
是二叉树的先序遍历,
inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
示例 2:
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
和 inorder
均
无重复 元素
inorder
均出现在 preorder
preorder
保证
为二叉树的前序遍历序列
inorder
保证
为二叉树的中序遍历序列
Code
241106
76ms
40ms
7ms 击败65.31%, 26.06MB 击败96.21%
4ms | 击败73.74% , 26.29 MB | 击败70.29%
中等
给定一组非负整数
nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
示例 2:
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109
Code
240928
刚开始我想复杂了,其实直接两个不同顺序相加即可比较。
中等
根据 百度百科
, 生命游戏 ,简称为 生命
,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n
个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:
1
即为 活细胞 (live),或 0
即为 死细胞
(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
- 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
- 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
- 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
- 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你
m x n
网格面板 board
的当前状态,返回下一个状态。
示例 1:
示例 2:
提示:
m == board.length
n == board[i].length
1 <= m, n <= 25
board[i][j]
为 0
或 1
进阶:
- 你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
- 本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?
Code
240927