首页 > 编程语言 >代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcode90.子集II

代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcode90.子集II

时间:2024-11-13 11:29:46浏览次数:1  
标签:return nums leetcode90 self 随想录 num 子集 result def

1 leetcode93.复原IP地址

题目链接:93. 复原 IP 地址 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili

思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连接就好了

1.1自己的代码

才开始犯了个错误,就是终止条件判断的时候忘记整个字符串的长度不能超过四这个条件了

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.backtracking(s,0)
        return self.result
    def backtracking(self,s,startindex):
        if startindex==len(s) and len(self.path[:]) == 4:
            path = '.'.join(self.path[:])
            self.result.append(path)
            return self.result
        for i in range(startindex,len(s)):
            if self.vaild_num(s[startindex:i+1]):
                self.path.append(s[startindex:i+1])
                self.backtracking(s,i+1)
                self.path.pop()

    def vaild_num(self,s):
        if s.isdigit():
            if 0<=int(s)<=255 and ((len(s)>1 and s[0] !='0')or(len(s)==1)):
                return True
        return False

1.2 视频后的思路

感觉视频里的思路对于python而言,没有我自己写的明了,感觉在判断当前的地址合法时有点啰嗦,嗯,更倾向于自己的这种方法

重点:发现这种方法耗时会很短的

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        result = []
        self.backtracking(s,0,0,'',result)
        return result
    def backtracking(self, s, start_index, point_num, current, result):
        if point_num == 3:  
            if self.is_valid(s, start_index, len(s) - 1): 
                current += s[start_index:] 
                result.append(current)
            return

        for i in range(start_index, len(s)):
            if self.is_valid(s, start_index, i): 
                sub = s[start_index:i + 1]
                self.backtracking(s, i + 1, point_num + 1, current + sub + '.', result)
            else:
                break

    def is_valid(self, s, start, end):
        if start > end:
            return False
        if s[start] == '0' and start != end:
            return False
        num = 0
        for i in range(start, end + 1):
            if not s[i].isdigit(): 
                return False
            num = num * 10 + int(s[i])
            if num > 255: 
                return False
        return True

1.3 本题小结

  1. 其实这道题感觉理解了上个题目的思路以后,并不难,能自己写出来
  2. 我发现虽然在理解上视频的方法会难一点,但是代码的运行速度上面,这种方法确实很快

2 leetcode78.子集

题目链接:78. 子集 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili

思路:嗯,想用之前的方法去尝试,发现好像不太行,还是看视频吧

2.1 视频后的代码

重点:我发现我不知道怎么写的地方居然是如何收获结果的,看了视频觉得自己有点不太聪明的样子

class Solution:
    def __init__(self):
        self.result = []
        self.num = []
    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.backtracking(nums,0)
        return self.result
    def backtracking(self,nums,startindex):
        self.result.append(self.num[:])
        if startindex ==len(nums):
            return 
        for i in range(startindex,len(nums)):
            self.num.append(nums[i])
            self.backtracking(nums,i+1)
            self.num.pop()

2.2 本题小结

  1. 这道题我不知道的是如何收获结果集,但是吧看了视频后又觉得自己不是很聪明的样子
  2. 真的好基础好模板化的一道题目

3 leetcode90.子集II

题目链接:90. 子集 II - 力扣(LeetCode)

文章链接:代码随想录

视频链接:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili

思路:看到这道题目,第一反应用之前组合的有一种去重可能就解决了,我先试试

3.1 自己的代码

真的和之前的思路没有任何区别

小问题:第一次提交忘记排序了

class Solution:
    def __init__(self):
        self.result = []
        self.num = []
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        self.backtracking(nums,0)
        return self.result
    def backtracking(self,nums,startindex):
        self.result.append(self.num[:])
        if startindex==len(nums):
            return
        for i in range(startindex,len(nums)):
            if i >startindex and nums[i]==nums[i-1]:
                continue
            self.num.append(nums[i])
            self.backtracking(nums,i+1)
            self.num.pop()

3.2 视频中的方法

使用used的方法,目前掌握的还不是很牢固,但是也还能写吧

class Solution:
    def __init__(self):
        self.result = []
        self.num = []
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        used = [False]*len(nums)
        self.backtracking(nums,0,used)
        return self.result
    def backtracking(self,nums,startindex,used):
        self.result.append(self.num[:])
        if startindex==len(nums):
            return
        for i in range(startindex,len(nums)):
            if i >0 and nums[i]==nums[i-1] and not used[i-1]:
                continue
            self.num.append(nums[i])
            used[i] = True
            self.backtracking(nums,i+1,used)
            used[i] = False
            self.num.pop()

3.3 本题小结

  1. 这道题目真的没有难题,就是之前内容的一个结合,我目前只掌握了一种方法,使用used的方法会用,但是写的不是很好
  2. 这个题目没有什么难点,做会了前面的题目以后

4 今日小结

  1. 整体题目上没有什么特别新的点,就是在子集的时候我开始不知道如何收集结果
  2. 整体而言,都是比较容易可以上手,可以顺利写完的,第一次花很短的时间看完视频写完题目

标签:return,nums,leetcode90,self,随想录,num,子集,result,def
From: https://www.cnblogs.com/csfy0524/p/18543574

相关文章

  • 代码随想录——二叉树17-路径总和
    这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。这里总结如下三点:如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii)如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需......
  • 代码随想录算法训练营第二十三天| leetcode39. 组合总和、leetcode40.组合总和II、lee
    1leetcode39.组合总和题目链接:39.组合总和-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibili思路:跟之前差不多,就是将他的循环改一下,但是我发现有重复的数值了,不知道如何删除1.1自......
  • 代码随想录算法训练营第十一天|LeetCode150.逆波兰表达式求值、239.滑动窗口最大值、3
    前言打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目在学......
  • 代码随想录 -- 动态规划 -- 完全背包理论基础
    52.携带研究材料(第七期模拟笔试)思路:dp[j]的含义:装满容量为j的背包时,背包的最大价值为dp[j].递推公式:当j>=weight[i]时:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])初始化:全部初始化为0遍历顺序:先遍历物品和先遍历背包都可以,都是从前往后遍历(因为物品可以重复使用)。n,......
  • 代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数
    资源引用:leetcode题目:344.反转字符串(344.反转字符串-力扣(LeetCode))541.反转字符串Ⅱ(541.反转字符串II-力扣(LeetCode))卡玛网题目:卡玛网54.替换数字(54.替换数字(第八期模拟笔试)(kamacoder.com))碎碎念回归:本来应该11月6号打卡的,因为接连4天的考试+多个竞赛,导致推迟......
  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • 动态规划-背包问题——416.分割等和子集
    1.题目解析题目来源416.分割等和子集——力扣测试用例 2.算法原理1.状态表示这里背包问题基本上和母题的思路大相径庭,母题请见[模板]01.背包 ,这里的状态表示与装满背包的情况类似,第二个下标就是当选择的物品体积直接等于j时是否可以装入"背包",本题是求是否......
  • 代码随想录算法训练营第二十二天| leetcode77. 组合、leetcode216.组合总和III、leetc
    1leetcode77.组合题目链接:77.组合-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多1.1回溯三部曲回溯的方法首......
  • 代码随想录算法训练营day43| 300.最长递增子序列 674. 最长连续递增序列 718. 最长
    学习资料:https://programmercarl.com/0300.最长上升子序列.html#算法公开课动态规划系列之子序列学习记录300.最长递增子序列(长度最少为1;dp[i]代表到i为止的最长子序列的长度;i的值根据i之前比如j的值来判断;每个地方都有可能获得最长长度)点击查看代码classSolution:def......