0009题 回文数【Palindrome Number】
题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
(进阶要求:你能不将整数转为字符串来解决这个问题吗?)
示例:
输入: 121
输出: true
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
题目相对严谨
需要注意:
1. 完成进阶要求时,负数单独考虑,其他分离,
O(n)
O
(
n
)
完成
简单题目,无需post代码。
0010题 正则表达式匹配【Regular Expression Matching】
题目:
给定一个字符串 (s
) 和一个字符模式 (p
)。实现支持 '.'
和 '*'
的正则表达式匹配。
'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s
) ,而不是部分字符串。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符.
和*
。
示例:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
输入:
s = "aa"
p = "a*"
输出: true
解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
题目相对严谨
需要注意:
1. 使用Python re库的时候,如果match匹配返回为None,则没有group()这个method。
2. 在不使用re库的情况下,需要额外小心越界情况
解题思路:
(re库大法好
在不使用re库的情况下,因为题目标签有“回溯”二字,所以使用多个stack来处理string和pattern的匹配模式,需要注意empty的情况,防止越界报错。
虽然是困难的题目,但是相对不难,故无需post代码。
0011题 盛最多水的容器【Container With Most Water】
题目:
给定 n 个非负整数
a1,a2,...,an
a
1
,
a
2
,
.
.
.
,
a
n
,每个数代表坐标中的一个点
(i,ai)
(
i
,
a
i
)
。画 n 条垂直线,使得垂直线 i 的两个端点分别为
(i,ai)
(
i
,
a
i
)
和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
示例:
输入:[1,1]
输出:1
题目相对严谨,理解需要一段时间
需要注意:
1. 这个是个容器,所以变量有两个,一个是高度,一个是宽度。
解题思路:
1. 暴力搜索,
O(n2)
O
(
n
2
)
2. 双指针巧妙计算,
O(n)
O
(
n
)
简单来讲,对于坐标i,可以使其容量最大化的另一坐标j,应为从右往左遍历
aj
a
j
中第一个比
ai
a
i
高的坐标。所以当
ai
a
i
比
aj
a
j
小的时候,移动
ai
a
i
,否则移动
aj
a
j
。
这里post代码(in Python):
class Solution:
def maxArea(self, h):
i = 0
j = h.__len__() - 1
res = -1
while i < j:
res = max((min(h[i], h[j]) * (j-i)), res)
if h[i] < h[j]:
i += 1
else:
j -= 1
return res