每天更新一道python or C++ leetcode题,力求讲解清晰准确,客官们可以点赞或者关注。
题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路:
观察到子集的长度为0,1,。。。。n不等,所以我们需要不断修改我们的递归条件,先把长度为0的子集全部添加进答案,接着是长度为1的,以此类推。
python:
class Solution:
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ans_list = []
nums.sort()
for i in range(0, len(nums)+1):#外侧循环,用来控制终止条件,i=2就表示当子集长度为2时终止
self.findsub(i, ans_list, nums, [])
return ans_list
def findsub(self, k, ans_list, nums, one_res):
if len(one_res) == k:
ans_list.append(one_res)
else:
for i in nums:
self.findsub(k, ans_list, nums[nums.index(i)+1:], one_res+[i])
C++
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
vector<int> path;
result.push_back(path);
if(nums.empty())
return result;
subsets_dfs(nums,0,path,result);
return result;
}
void subsets_dfs(vector<int>& nums,int pos,vector<int>& path,vector<vector<int>>& result)
{
if(pos==nums.size())
return;
for(int i=pos;i<nums.size(); i++)
{
path.push_back(nums[i]);
result.push_back(path);
subsets_dfs(nums,i+1,path,result);
path.pop_back();//与第77题非常类似,C++的回溯一般需要手动完成,而不像python可以直接写在参数里
}
}
};
总结:python用slice对数组切片,而在C++中我们需要start指针,并且往往需要手动完成回溯。