题目描述:现在有一个没有重复元素的整数集合S,求S的所有子集
注意:你给出的子集中的元素必须按升序排列,给出的解集中不能出现重复的元素
示例1
输入:[1,2,3]
返回值:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
思路:要想求得n个非重复元素的子集,还要按照升序排列,那么简单直接地先把数组排序;对于长度为1的数组,它的子集为[]和[val],而当数组长度大于1时,发现子集存在这样一个规律:长度为n的数组的子集=长度为n-1的数组的子集+以该子集添加第n个元素后的子集,(顾名思义,同时浅显易懂,其实就是包含第n个元素的子集 与 不包含第n个元素的子集)。因此考虑使用递归,要想求长度为n的数组的子集,先取出最后一个元素,求得前n-1个元素的子集RESn1,然后利用RESn1子集生成包含第n个元素的子集RESn(即RESn1中的每个子集分别添加第n个元素即可),最后按照子集长度依次排列并排序进入RES,返回结果RES。
class Solution { public: vector<vector<int> > subsets(vector<int> &S) {//本质是递归 vector<vector<int> > RES; sort(S.begin(),S.end());//先进行排序 int n = S.size(); if(n == 1) { vector<int> res; RES.push_back(res); res.push_back(S[0]); RES.push_back(res); } else { vector<int> R; for(int i=0;i<n-1;i++) R.push_back(S[i]);//去除最后一个元素的数组 int last = S[n-1];//获取最后一个元素值 vector<vector<int> > RESn1 = subsets(R);//不包含最后一个元素的子集 int s = RESn1.size(); vector<vector<int> > RESn;//利用不包含最后一个元素的子集来获得包含最后一个元素的子集; for(int i=0;i<RESn1.size();i++) { vector<int> temp = RESn1[i]; temp.push_back(last); RESn.push_back(temp); } int len=0,q=0; vector<vector<int> > RESlen;//各个长度的子集(如长度为0、1、2.。,n的子集) while(len<=n) { while(q<s) { if(RESn1[q].size() == len) RESlen.push_back(RESn1[q]); if(RESn[q].size() == len) RESlen.push_back(RESn[q]); q++; } sort(RESlen.begin(),RESlen.end()); for(int j=0;j<RESlen.size();j++) { RES.push_back(RESlen[j]); } RESlen.clear(); len++; q=0; } } return RES; } };