递归(二)---力扣22括号生成,力扣78求子集

22. 括号生成https://leetcode.cn/problems/generate-parentheses/

括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的括号组合。

示例 1:

复制代码
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

复制代码
输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

代码

复制代码
from typing import List

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def backtrack(current: str, open_count: int, close_count: int):
            if len(current) == 2 * n:
                result.append(current)
                return
            if open_count < n:
                backtrack(current + '(', open_count + 1, close_count)
            if close_count < open_count:
                backtrack(current + ')', open_count, close_count + 1)

        result = []
        backtrack('', 0, 0)
        return result
if __name__ == '__main__':
    s = Solution()
    print(s.generateParenthesis(3))

求子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集

(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

复制代码
输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= numsi <= 10
  • nums 中的所有元素 互不相同
复制代码
from typing import List

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        def backtrack(start: int, current: List[int]):
            # 每个状态都是一个有效的子集,所以都要加入结果集
            result.append(current[:])
            
            # 从start开始遍历,避免重复
            for i in range(start, len(nums)):
                # 选择当前数字
                current.append(nums[i])
                # 递归生成包含当前数字的子集
                backtrack(i + 1, current)
                # 回溯,移除当前数字
                current.pop()
        
        result = []
        backtrack(0, [])
        return result

if __name__ == '__main__':
    s = Solution()
    print(s.subsets([1,2,3]))

初始状态: \[\]

  • 添加 \[\] 到结果集

选择1:

  • 1

  • 添加 1 到结果集

选择1,2:

  • 1,2

  • 添加 1,2 到结果集

选择1,2,3:

  • 1,2,3

  • 添加 1,2,3 到结果集

回溯,移除3: 1,2

回溯,移除2: 1

选择1,3:

  • 1,3

  • 添加 1,3 到结果集

回溯,移除3: 1

回溯,移除1: \[\]

选择2:

  • 2

  • 添加 2 到结果集

选择2,3:

  • 2,3

  • 添加 2,3 到结果集

回溯,移除3: 2

回溯,移除2: \[\]

选择3:

  • 3

  • 添加 3 到结果集

相关推荐
在世修行1 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885722 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI2 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
信誓旦旦的程序猿2 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫3 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
下一站春风里3 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑4 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl4 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
运维行者_4 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php