Leetcode题解 0004期

0009题 回文数【Palindrome Number】

题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
(进阶要求:你能不将整数转为字符串来解决这个问题吗?)
示例:

输入: 121
输出: true

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

题目相对严谨

需要注意:
1. 完成进阶要求时,负数单独考虑,其他分离, 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 个非负整数 a 1 a 2 . . . a n ,每个数代表坐标中的一个点 ( i , a i ) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 ( i , a i ) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

注意:你不能倾斜容器,n 至少是2。

示例:

输入:[1,1]
输出:1

题目相对严谨,理解需要一段时间

需要注意:
1. 这个是个容器,所以变量有两个,一个是高度,一个是宽度。

解题思路:
1. 暴力搜索, O ( n 2 )
2. 双指针巧妙计算, O ( n )

简单来讲,对于坐标i,可以使其容量最大化的另一坐标j,应为从右往左遍历 a j 中第一个比 a i 高的坐标。所以当 a i a j 小的时候,移动 a i ,否则移动 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

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80556553