【python-leetcode78-子集】子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
由于是子集的第一题,暂时还没有套路。
方法一:直接看过程,假设我们现在有一个存储结果的数组res=[[]],nums=[1,2,3]
第一步:res=[[]]
第二步:res=[[],[1]]
第三步:res=[[],[2],[1],[1,2]]
第四步:res=[[],[3],[2],[2,3],[1],[1,3],[1,2,3]]
也就是说每次取出res中里面的一维数组,然后将当前nums中的数加进去,再和原来的res相加即可
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[[]]
for num in nums:
res=res+[tmp+[num] for tmp in res]
return res
方法二:python中自带的库
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
for i in range(len(nums)+1):
for tmp in itertools.combinations(nums, i):
res.append(tmp)
return res
会单独再写一篇记录一下itertools的用法
方法三:回溯,解决子集这种问题的话一般就是这种方法了。不过不好理解。
回溯法的核心就是试错,碰到不符合要求的就返回。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
global res
res=[]
self.helper(0,[],nums)
return res
def helper(self,i,tmp,nums):
res.append(tmp)
for j in range(i,len(nums)):
self.helper(j+1,tmp+[nums[j]],nums)
其中的核心是遍历的下标以及将tmp带入到递归中。
输出:[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
捋一捋过程吧:
首先是res=[]
执行helper(0,[],[1,2,3])
然后res=[[]]
这里有个for j in range(0,3)
执行helper(1,[]+[1],[1,2,3])
然后res=[[],[1]]
这里有个for j in range(1,3)
执行helper(2,[1]+[2],[1,2,3])
然后res=[[],[1],[1,2]]
依次类推之后我们就有[[],[1],[1,2],[1,2,3]]
此时,别忘了我们还有for循环中没有循环完
for j in range(0,3)
for j in range(1,3)
for j in range(2,3)
与子集有关的题目还有:
参考:
作者:powcai 链接:https://leetcode-cn.com/problems/subsets/solution/hui-su-suan-fa-by-powcai-5/ 来源:力扣(LeetCode)
- 微信小程序使用WebSokcet实现相关请求
- Vue.js系列之二Vue实例
- autoload自动加载机制使用
- EF 约定介绍
- 关于EF Code First模式不同建模方式对建表产生的影响
- C# 命名空间和程序集
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
- 防止小程序多次点击跳转解决方案
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
- Web API系列之三 基本功能实现
- 微信小程序的省市选择组件 citySelector分享
- 详述 Java 语言中的 String、StringBuffer 和 StringBuilder 的使用方法及区别
- Class与Style绑定
- 机器学习并不难
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法