Python小白 Leetcode刷题历程 No.16-No.20 最接近的三数之和、电话号码的字母组合、四数之和、删除链表的倒数第N个节点、有效的括号 (有题干 有代码 有思路心得)

Python小白 Leetcode刷题历程 No.16-No.20 最接近的三数之和、Phone Number的字母组合、四数之和、删除链表的倒数第N个节点、有效的括号

写在前面:

作为一个计算机院的大学生,总觉得仅仅在学校粗略的学习计算机专业课是不够的,尤其是假期大量的空档期,作为一个小白,实习也莫得路子,又不想白白耗费时间。于是选择了Leetcode这个平台来刷题库。编程我只学过基础的C语言,现在在自学Python,所以用Python3.8刷题库。现在我Python掌握的还不是很熟练,算法什么的也还没学,就先不考虑算法上的优化了,单纯以解题为目的,复杂程度什么的以后有时间再优化。计划顺序五个题写一篇日志,希望其他初学编程的人起到一些帮助,写算是对自己学习历程的一个见证了吧。

有一起刷LeetCode的可以关注我一下,我会一直发LeetCode题库Python3解法的,也可以一起探讨。

觉得有用的话可以点赞关注下哦,谢谢大家!
········································································································································································
题解框架:

    1.题目,难度
    2.题干,题目描述
    3.题解代码(Python3(不是Python,是Python3))
    4.或许有用的知识点(不一定有)
    5.解题思路
    6.优解代码及分析(当我发现有比我写的好很多的代码和思路我就会写在这里)

········································································································································································

No.16.最接近的三数之和

难度:中等
题目描述:


在这里插入图片描述

题解代码(Python3.8)

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        res=nums[0]+nums[1]+nums[2]
        d=abs(res-target)
        l=len(nums)
        for i in range(l-2):
            L=i+1
            R=l-1
            while L<R:
                if abs(nums[i]+nums[L]+nums[R]-target)<d:
                    res=nums[i]+nums[L]+nums[R]
                    d=abs(res-target)
                if (nums[i]+nums[L]+nums[R])==target:
                    return res 
                elif nums[i]+nums[L]+nums[R]>target:
                    R -=1
                else:
                    L +=1
        return res

或许有用的知识点:
abs(x)=x的绝对值。

解题思路:
第十五题‘No.15.三数之和’思路类似,从一个数组中确定三个数,可以先for循环确定一个数,再用双指针法确定后两个数,然后判断,根据判断结果移动指针直到不满足L<R。

No.17.电话号码的字母组合

难度:中等
题目描述:


在这里插入图片描述

题解代码(Python3.8)

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        phone={'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],
               '6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
        def backtrack(combination,next_digits):
            if len(next_digits)==0:
                output.append(combination)
            else:
                for letter in phone[next_digits[0]]:
                    backtrack(combination+letter,next_digits[1:])
        output=[]
        if digits:
            backtrack("",digits)
        return output

或许有用的知识点:
回溯算法,在树形结构中找全部的解,通常使用回溯算法。

解题思路:
对与“23”我们不难推断出它的解为下图:


在这里插入图片描述

这显然是在树形结构求树叶的全部解,在树形结构中找全部的解,通常使用回溯算法。
先写出这个题的字典,phone={‘数字(key)’:‘对应字母(value)’},然后定义回溯函数运算即可,当剩余数字长度为0,结束循环,否则,for遍历这个数字的所有字母值,在每个循环中再次进行回溯函数。

No.18.四数之和

难度:中等
题目描述:


在这里插入图片描述

题解代码(Python3.8)

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        l=len(nums)                                            #特解
        if l<4:
            return []
        res=[]
        nums.sort()                                                 
        for i in range(l-2):
            if nums[i]>(target/4)+1:                                      #最小数>target/4,跳出循环
                break
            if i>0 and nums[i]==nums[i-1]:                             #最小数与上一轮循环相同,防止重复解,跳过
                continue
            for j in range(l)[::-1]:
                if nums[j]<(target/4)-1:                                      #最大数<target/4,跳出循环
                    break
                if j<l-1 and nums[j]==nums[j+1]:                             #最大数与上一轮循环相同,防止重复解,跳过
                    continue
                L=i+1
                R=j-1
                while L<R:
                    if nums[i]+nums[L]+nums[R]+nums[j] == target:
                        res.append([nums[i],nums[L],nums[R],nums[j]])
                        while L<R and nums[L]==nums[L+1]:          #左指针向右跳过重复值,防止重复解 
                            L +=1
                        while L<R and nums[R]==nums[R-1]:          #右指针向左跳过重复值,防止重复解 
                            R -=1
                        L +=1
                        R -=1
                    elif nums[i]+nums[L]+nums[R]+nums[j] > target:              #四数和>0,右指针大了,左移
                        R -=1
                    else:                                          #四数和<0,左指针小了,右移
                        L +=1   
        return res

解题思路:
这题跟例题第十五题‘No.15.三数之和’基本一致,只不过多了个数,我们可以确定一个最大数和一个最小数,中间两数用双指针。这道题我代码中的标注很详细,解题思路和15题基本一致。

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

难度:中等
题目描述:


在这里插入图片描述

题解代码(Python3.8)

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy=ListNode(0)
        dummy.next=head
        i=0
        p=dummy
        while p:
            p=p.next
            i+=1
        p=dummy
        j=0
        while True:
            if j==i-1-n:
                p.next=p.next.next
                return dummy.next 
            p=p.next
            j+=1

或许有用的知识点:
当处理链表且需要考虑空链表时,我们或许可以设置一个哑结点,即dummy.next = head。快慢指针思想(见‘优解代码及分析’)。

解题思路:
这个题要求删除链表的倒数第 n 个节点,并且返回链表的头结点。为了避免空链表的特殊情况,我们要设置一个哑节点。因为链表是单向的,我们首先要知道链表的总长度i,再将第i-1-n个节点直向下下个节点即可,最后我们返回哑节点的下个节点即为原链表的头节点。

优解代码及分析:
优解代码(Python3.8)

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # 增加一个哑节点方便边界判断
        dummy = ListNode(0)
        dummy.next,a,b = head,dummy,dummy
        # 第一个循环,b指针先往前走n步
        while n>0 and b:
            b,n = b.next,n-1
        # 假设整个链表长l<n,那么第一次遍历完后b=NULL,于是后面的判断就不用继续了,直接返回
        if not b:
     ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200126050737205.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhblhpdV8=,size_16,color_FFFFFF,t_70)       return head
        # 第二次,b指针走到链表最后,a指针也跟着走,当b=NULL时遍历结束,a指针就指向要删除的节点的前一个位置
        while b.next:
            a,b = a.next,b.next
        # 删除节点并返回   
        a.next = a.next.next
        return dummy.next

分析:
使用了快慢指针思想,只用了一次遍历就找到了倒数第n个节点。如需快慢指针的具体内容和其他用途可以查看本题‘或许有用的知识点’中的链接。

No.20.有效的括号

难度:简单
题目描述:


在这里插入图片描述

题解代码(Python3.8)

class Solution:
    def isValid(self, s: str) -> bool:
        stack=['?']
        dic={')':'(','}':'{',']':'['}
        for char in s:
            if char in dic:
                top=stack.pop()
                if top != dic[char]:
                    return False
            else:
                stack.append(char)
        return  stack==['?']

或许有用的知识点:
temp=list.pop(),是弹出list中最后一个元素,并储存到temp中,list.pop()就是直接弹出最后一个元素。
解决括号配对这类二元就近配对的问题,可以运用栈的思想。

解题思路:设‘(’类的为开括号,‘)’类的为闭括号,设置一个字典dic={‘闭括号(key)’:’开括号(value)’}。用for循环遍历字符串中每一个字符,如果这个字符是开括号(不是dic的key),就把它写入list中,如果这个字符是闭括号,就弹出list中最后一个字符,判断与该字符对应字符是否相等,不相等则False。为了防止开括号数量小造成闭括号匹配出错的情况,我们应先给list赋一个初值,最后返回判断list是否与初值相同的布尔值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容