15. 三数之和
什么情况下用双指针?
遍历列表,且需要同时知道两个值的时候,而且遍历的时候要求不重复遍历时都可以用,11. 盛最多水的容器也是这种情况。
如何去重?
建立字典or排序
17. 电话号码的字母组合
遇到字符串问题,要考虑1.字符串合法性,2.空字符串。
循环
自己写的循环只会固定长度,比如range(len(s)),但是对于一开始并不知道多少长度,或者随着循环的进行,内部的另一个循环长度在变化,这种固定长度的无法解决问题,因此需要动态的变量作为range,比如
conversion={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
product=['']
for k in digits:
product=[i+j for i in product for j in conversion[k]]
return product
上面代码里的product就在不断的变化,另外这里product初始的情况['']设定也值得思考,这也许是python自带的特性,我自己第一次看的时候根本想不到product最后返回的是一个什么样的东西
另外一个解析:回溯,是递归的一种
当题目中出现“所有组合”等类似字眼时,我们第一感觉就要想到用回溯。
def letterCombinations(digits: str) :
if not digits: return []
def backtrack(combination, nextdigit):
# 注意backtrack并没有将res作为传入参数,而是可以直接操作
if len(nextdigit) == 0:
res.append(combination)
if nextdigit != '':
for j in conversion[nextdigit[0]]:
backtrack(combination + j, nextdigit[1:])
res = []
backtrack('', digits)
return res
时间复杂度和空间复杂度都是
18. 四数之和
剪枝,能让实际运行效率提升个十倍
剪枝就是提前结束或者跳过某些情况
19. 删除链表的倒数第N个节点
这题虽然自己写对了,但是要写出针对几种特殊情况的if,说明对问题的抽象还不是很好,就这题思考一下在写链表相关问题时应该如何抽象
自己用了列表来存储节点,如果用到列表,就要考虑这些情况:
1.列表为空
2.后续操作需要列表中的某个元素,但是该索引不一定每种测试案例都会在列表中存在
而对于这道题,在已有数据结构链表上进行操作,如果仅使用指针,则无需担心索引问题,但是需要建立哑节点来处理链表为空的情况,建立哑结点也就相当于解决了使用列表时遇到的两个问题,保证了列表的最低长度