每日一道算法题--leetcode 78--子集--C++

给定一个不包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

讲解:

1.首先补充一下有关vector的知识,见我的另一篇https://mp.csdn.net/postedit/84297312

2.代码的整体思路就是:逐个加入nums中的元素,每加入一个元素,就对output现有的所有数组,加入该元素,放入output末尾,nums中有多少元素就迭代多少次,由于该题目给的数组不包含重复元素,因此可以这样做。

可以用递推的思想,观察S=[], S =[1], S = [1, 2] 时解的变化。

可以发现S=[1, 2] 的解就是 把S = [1]的所有解末尾添上2,然后再并上S = [1]里面的原有解。因此可以定义vector<vector<int> > 作为返回结果output, 开始时什么都没有,第一步放入一个空的vecotr<int>,然后这样迭代n次,n等于nums元素的数量,每次更新output内容,最后返回output。

代码:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> output;
        vector<int> subset;
        int length=nums.size();
        output.push_back(subset);
        int current=0;
        int output_size;
        while(current<length){
            output_size=output.size();
            for(int i=0;i<output_size;i++){
                vector<int> newinsert=output[i];
                newinsert.insert(newinsert.end(),nums[current]);
                output.push_back(newinsert);
            }
            current++;
        }
        
        return output;
    }
};
结果:

这样的算法时间复杂度大约为O(n^2),不是很好。欢迎提更好的方法。

猜你喜欢

转载自blog.csdn.net/transformed/article/details/84296004