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

每天更新一道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指针,并且往往需要手动完成回溯。

猜你喜欢

转载自blog.csdn.net/weixin_41958153/article/details/81697653