首页 > 编程语言 >day25 代码随想录算法训练营 216. 组合总和 III

day25 代码随想录算法训练营 216. 组合总和 III

时间:2024-01-24 17:22:55浏览次数:31  
标签:216 剪枝 day25 res sum 随想录 int path self

题目:216. 组合总和 III

我的感悟:

  • 还是按照之前的套路来。
  • 多了一个参数path_sum
  • 应该是有两处剪枝,1处横线剪枝,1处纵向剪枝?或者说1处求和剪枝?1处范围剪枝?【疑问】

理解难点:

  • 不剪枝的已经模的差不多了,剪枝的再看看

 

自己听了一遍写的:[未剪枝]

class Solution:
    def combinationSum3(self, k: int, sum_n: int) -> List[List[int]]:
        res = []
        path_sum = 0
        self.backtrack(k,sum_n,1,[],res,path_sum)
        return res
    
    def backtrack(self,k,sum_n,start,path,res,path_sum):
        # 退出条件
        if len(path) == k:
            if path_sum == sum_n: 
                res.append(path[:])
            return 
        
        # 核心遍历
        for i in range(start,10):
            path.append(i)
            path_sum += i
            self.backtrack(k,sum_n,i+1,path,res,path_sum)
            path_sum -= i
            path.pop()

剪枝版本:

class Solution:
    def combinationSum3(self, k: int, sum_n: int) -> List[List[int]]:
        res = []
        path_sum = 0
        self.backtrack(k,sum_n,1,[],res,path_sum)
        return res
    
    def backtrack(self,k,sum_n,start,path,res,path_sum):
        # 剪枝1
        if path_sum > sum_n:
            return
        # 退出条件
        if len(path) == k:
            if path_sum == sum_n: 
                res.append(path[:])
            return 
        
        # 核心遍历
        for i in range(start,10):
            if 10 - i < k - len(path):  # 剪枝2
                break
            path.append(i)
            path_sum += i
            self.backtrack(k,sum_n,i+1,path,res,path_sum)
            path_sum -= i
            path.pop()

代码示例:

通过截图:

 

扩展写法:

资料:

标签:216,剪枝,day25,res,sum,随想录,int,path,self
From: https://www.cnblogs.com/liqi175/p/17985117

相关文章

  • STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的FSMC实现以轮询或DMA的方式读写IS62WV51216(SRAM)芯片3、......
  • 代码随想录 day28 复原IP地址 子集 子集II
    复原IP地址本题确实比较有难度主要很难一开始就发现切入点虽然被提示了和切割字符串很像还是看了题解回溯部分重点就是怎么去切割这个ip地址这里注意要尝试每个位置都去加'.'去分割后面会回溯由于是ip地址也就是提示了是四段式并且利用isValid去判断是否合法还有一些......
  • [代码随想录] 第十二天
    144.二叉树的前序遍历[https://leetcode.cn/problems/binary-tree-preorder-traversal/]思路:栈实现的迭代遍历:出栈记录,右孩子非空右孩子进栈,左孩子非空左孩子进栈。/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*Tre......
  • [代码随想录] 第十一天
    239.滑动窗口最大值[https://leetcode.cn/problems/sliding-window-maximum/submissions/497438333/]思路:滑动窗口大小为K,现在前K个数中找到Max值进入ans数组,然后开始向后遍历,每进入一个数字时先判断if(nums[i-k]==max),查看上一个max是否被滑动窗口滑出,若已滑出则在当前滑动窗口......
  • 代码随想录 day27 组合总和 组合总和 II 分割回文串
    组合总和其实总的思路和前面几类组合问题区别不大本题由于说明了元素可以重复选取且无需考虑sum为0的情况只需要把边界的startIndex迭代从i+1变成i即可i表示可以选取元素本身很容易写出以下未进行剪枝的代码剪枝情况只是多了一种也就是sum+下一个候选元素>targ......
  • 代码随想录算法训练营第 十 一 天| 20. 有效的括号 1047. 删除字符串中的所有相邻重
    LeetCode 20.有效的括号题目链接:20.有效的括号思路:采用栈数据结构解题;遇到左括号,压右括号入栈 LeetCode 1047.删除字符串中的所有相邻重复项题目链接:1047.删除字符串中的所有相邻重复项注意:Java中队列实现类API的使用 LeetCode 150.逆波兰表达式求值题目链......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    LeetCode232.用栈实现队列题目链接:232.用栈实现队列思路:用两个栈实现队列 LeetCode  225.用队列实现栈 题目链接:225.用队列实现栈 思路:一个队列对栈进行实现(实现栈中的方法) ......
  • 代码随想录 day25 组合总和Ⅲ 电话号码的字母组合
    组合总和Ⅲ跟组合总和Ⅰ很像这里固定了是1-9的范围而且确定了取k个数字那么就是确定了树的高度和宽度注意一下回溯的写法和边界条件就好还有剪枝操作如下其实就是当sum已经大于n就不需要再进行了电话号码的字母组合这题就是一般的回溯问题难点其实是在这投影怎么......
  • 代码随想录 day24 回溯初体验
    组合熟悉一下回溯算法的基本流程以下是未曾进行剪枝处理的代码为什么要进行剪枝呢因为有一些情况是显然不可能成立的如下既然要取4个元素那么当取了1个元素之后集合剩余的元素不足4个不可能满足要求直接舍去具体边界思考路径剪枝代码如下......
  • [代码随想录] 第九天
    232.栈实现队列[https://leetcode.cn/problems/implement-queue-using-stacks/description/]思路:无classMyQueue{Stack<Integer>stackIn;Stack<Integer>stackOut;inttemp;publicMyQueue(){stackIn=newStack<>();......