每日一道算法题--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),不是很好。欢迎提更好的方法。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值