递归(二)---力扣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 <= nums[i] <= 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] 到结果集

相关推荐
每天写点bug4 分钟前
【go每日一题】:并发任务调度器
开发语言·后端·golang
一个不秃头的 程序员5 分钟前
代码加入SFTP Go ---(小白篇5)
开发语言·后端·golang
鬼义II虎神9 分钟前
将Minio设置为Django的默认Storage(django-storages)
python·django·minio·django-storages
数据小爬虫@15 分钟前
Python爬虫抓取数据,有哪些常见的问题?
开发语言·爬虫·python
Byron Loong28 分钟前
Python+OpenCV系列:【打卡系统-工具模块设计】工具模块深度揭秘,考勤智能化的核心秘籍!
python·opencv·webpack
逊嘘28 分钟前
【Java数据结构】ArrayList相关的算法
java·开发语言
漫无目的行走的月亮33 分钟前
基于Python Scrapy的豆瓣Top250电影爬虫程序
爬虫·python·scrapy
这里有鱼汤33 分钟前
数据分析从入门到放飞:Python三大金刚来助阵!
后端·python
基哥的奋斗历程1 小时前
初识Go语言
开发语言·后端·golang
煤泥做不到的!1 小时前
挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串
开发语言·c++