您的位置:首页 > 编程语言 > C语言/C++

Leetcode 078 子集 Python C++ 史上最详细题解系列

2018-08-15 08:50 477 查看

每天更新一道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:

[code]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++

[code]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指针,并且往往需要手动完成回溯。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: