leetcode感悟11-20

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最后返回的是一个什么样的东西

另外一个解析:回溯,是递归的一种

https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/hui-su-dui-lie-tu-jie-by-ml-zimingmeng/

当题目中出现“所有组合”等类似字眼时,我们第一感觉就要想到用回溯。

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

时间复杂度和空间复杂度都是O\left ( 3^{M}\times 4^{N}\right )

 

18. 四数之和

剪枝,能让实际运行效率提升个十倍

剪枝就是提前结束或者跳过某些情况

 

19. 删除链表的倒数第N个节点

这题虽然自己写对了,但是要写出针对几种特殊情况的if,说明对问题的抽象还不是很好,就这题思考一下在写链表相关问题时应该如何抽象

自己用了列表来存储节点,如果用到列表,就要考虑这些情况:

1.列表为空

2.后续操作需要列表中的某个元素,但是该索引不一定每种测试案例都会在列表中存在

而对于这道题,在已有数据结构链表上进行操作,如果仅使用指针,则无需担心索引问题,但是需要建立哑节点来处理链表为空的情况,建立哑结点也就相当于解决了使用列表时遇到的两个问题,保证了列表的最低长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值