难度中等1536收藏分享切换为英文接收动态反馈
给你一个整数数组 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
中的所有元素 互不相同
题解:
数组有n个数,子集数量则应当为2的n次方个,从0到2的n次方的数,用二进制表示可以发现,他们类似与我们这题要求解的答案
将1的位置设置为有,0的位置设置为没有,
我认为这里是借鉴了0到2的n次方的数不会重复,符合题意的思想,
例如nums = [1 , 2 , 3] ,应有2的3次方,8种子集,这八种为
000 001 010 011 100 101 110 111 即0 1 2 3 4 5 6 7
我们将这8种情况 根据n即数组的长度 依次右位移 0 1 2 次然后与1进行与运算(这样做的目的就是为了找到这8种情况中1的位置)
如001,= [3] 如011 为 [2 , 3] ,我们求1的位置就是为了求我们需要求得的8种数组。
Python代码:
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []#定义一个里面能放数组的大数组
for i in range(2**(len(nums))): # //遍历本题的2的n次方个值 。即2的n次方种情
temp = [] #建立一个空数组用来存放每种情况的值
for j in range(len(nums)): #因为数组的长度,决定位移的位数,所以这里放置数组的长度求解
if (i>>j)&1:temp.append(nums[j]) #一位一位的移动,目的是为了求解里面一共有几个1,有1的即为数组某一位数组是否存在的情况
ans.append(temp)#将每种情况压入堆栈
return ans
C++代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans; //定义一个里面能放数组的大数组
int n = nums.size(); //求本题给的数组的长度
for (int i=0; i<1<<n; i++){ //遍历本题的2的n次方个值 。即2的n次方种情况
vector<int> res; //建立一个空数组用来存放每种情况的值
for (int j=0; j<n; j++){ //因为数组的长度,决定位移的位数,所以这里放置数组的长度求解
if ((i>>j)&1) res.push_back(nums[j]); //一位一位的移动,目的是为了求解里面一共有几个1,有1的即为数组某一位数组是否存在的情况
}
ans.push_back(res); //将每种情况压入堆栈
}
return ans;
}
};