5. Longest Palindromic Substring
思路:str = ababab, 得到逆向str2=bababa 找到str 与str2的最长公共子序列
LPS(i,j)=str[i]与str2[j]的LPS
LPS(i,j)=LPS(i-1,j-1) if str[i]==str2[j]
0 if str[i] !=str2[j]
这个思路不对, str=absdsssba的时候就会出错 得到abs是最长回文序列
LPS(i,j)表示从str[i:j]最长回文序列
i>j LPS(i,j)=0
i=j LPS(i,j)=1
i
13. Roman to Integer
roman={‘I’:1,’V’:5,’X’:10,’L’:50,’C’:100,’D’:500,’M’:1000}
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12
小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9
规律:
第一,如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字
第二,其他情况则减去这个数字
12. Integer to Roman
v1=[“”,”M”,”MM”,”MMM”] 1000,2000,3000
v2=[“”,”C”,”CC”,”CCC”,”CD”,”D”,”DC”,”DCC”,”DCCC”,”CM”] 0~900
v3=[“”, “X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”] 0~90
v4=[“”, “I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”] 0~9
直接查表,把每一位表示出来
41. First Missing Positive
给一个乱序的数组,找到最小的没有出现的整数
思路是通过不停地交换使得A[i]=i+1
比如[3,5,1,2,6,7]
->[1,5,3,2,6,7]
->[1,6,3,2,5,7]
->[1,7,3,2,5,6]
->[1,2,3,7,5,6]
找到第一个A[i]!=i+1的就是4
42. Trapping Rain Water
给一个高度序列,找到能装最多的水
一个时间O(n)空间O(1)的方法:
维护两个值,左边最大maxleft和右边最大maxright,初始化为0
从两边往中间读,如果left
49. Group Anagrams
这道题用到一个很巧妙的解法,就是将每一个字符映射到一个素数,然后每个词的标识就等于各个字符的成绩
python 的字符加减要用ord(‘k’)-ord(‘a’)来做 将字符转换成对应的编码
55. Jump Game
这道题也很有意思,数组nums 表示在位置i能走的最大步数,然后判断是否能够到达数组最后一个位置
从0开始维护一个最远可到达位置maxpos,如果maxpos
56. Merge Intervals
将重叠的时间段合并
这道题一开始没有想要用排序做,结果就很麻烦,其实用排序的话就很简单了
主要有两个python 语法要记得
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
ans = []
for i in sorted(intervals, key=lambda i:i.start):#排序
if ans and ans[-1].end >= i.start:#最后一项
ans[-1].end = max(ans[-1].end,i.end)
else:
ans+=[i]
return ans
200. Number of Islands
DFS 来把属于一个岛上的1全部变成0
本来没什么问题,但是python 总是超时,才发现 用
i in range(len(grid))
0<=i < len(grid)
两个方法的效率不同,其中 第二种方法更快
136. Single Number
找到唯一一个只出现一次的数字,其他数字都出现两次 O(n)时间,O(1)空间
用异或来做
N^N =0
0^N=N
(N1^N1)^(N2^N2)…(N)=N