给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
二进制
①使用两层循环,外层循环为子集个数,对于集合长度为N,子集个数为。外层循环每循环一次一个子集。内层循环用来判断二进制下标为i的位置数是否为"1",如果对应位为1,那么就输出这个位,如果对应位为0,那么不输出这个位。
②以集合[1,2,3]为例,N = len([1,2,3]),外层循环 i 取值范围为[0,7],内层循环用于判断 i 对应二进制下标为j的位置是否为1。如果 (i >>j)%2为真,那么输出此子集。
③当 i =0时,无论 i 对应二进制000右移0位,1位,还是2位,即(i>>j)%2始终为0(假),输出空集。
④当 i =1时, i 对应二进制001右移0位,即(i>>j)%2为1(真),输出[1]。 i 对应二进制001右移1位为000,即(i>>j)%2为0(假),不追加。 i 对应二进制001右移2位为000,即(i>>j)%2为0(假),不追加。最终输出[1]。
......
⑤当 i = 3时,i 对应二进制011右移0位,即(i>>j)%2为1(真),输出[1]。 i 对应二进制011右移1位为001,即(i>>j)%2为1(真),追加输出[1,2]。 i 对应二进制011右移2位为000,即(i>>j)%2为0(假),不追加。最终输出[1,2]。
......
⑥当 i = 6时,i 对应二进制110右移0位,即(i>>j)%2为0(假),输出[]。 i 对应二进制110右移1位为011,即(i>>j)%2为1(真),追加输出[2]。 i 对应二进制110右移2位为001,即(i>>j)%2为1(真),追加输出[2,3]。最终输出[2,3]。
⑦当 i = 7时,i 对应二进制111右移0位,即(i>>j)%2为1(真),输出[1]。 i 对应二进制111右移1位为011,即(i>>j)%2为1(真),追加输出[1,2]。 i 对应二进制111右移2位为001,即(i>>j)%2为1(真),追加输出[1,2,3]。最终输出[1,2,3]。
Code
def subsets(self, nums: List[int]) -> List[List[int]]:
length, ans = len(nums), []
for i in range(2 ** length):
tmp = []
for j in range(length):
if (i >> j) % 2:
tmp.append(nums[j])
ans.append(tmp)
return ans