LeetCode | Subsets I,II

来源:互联网 发布:mysql scope identity 编辑:程序博客网 时间:2024/05/19 06:47

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

求一个数组的子集,使用递归的做法,使用一个临时数组【用于像栈一样】记录深搜的时候当前分支有多少个数组元素。
使用deep从0开始递增表示递归深度,当deep==nums.size()的时候为递归终点,此时将temp推入到result里面。
需要注意为了避免重复需要利用sort将数组进行排序。

class Solution {public:    vector<vector<int>> subsets(vector<int>& nums) {        sort(nums.begin(),nums.end());        vector<int> temp;        vector<vector<int> > result;        subsets(nums,temp,0,result);        return result;    }    void subsets(vector<int>& nums,vector<int> & temp,int size,vector<vector<int> >& result){        if(size==nums.size()){            result.push_back(temp);            return;        }        //不选当前元素        subsets(nums,temp,size+1,result);        temp.push_back(nums[size]);        subsets(nums,temp,size+1,result);        temp.pop_back();    }};

II是I的升级版,这时候里面有重复元素。
于是就是一个判重问题。
主体代码完全相同

思考一下如何进行判重,如果有一个元素的长度同当前temp相等并且在比较相等的时候可以一直比较到最后一位。这时候表明这个元素是重复的,不应当推入。

class Solution {public:    vector<vector<int>> subsetsWithDup(vector<int>& nums) {        sort(nums.begin(),nums.end());        vector<vector<int> > result;        vector<int> temp;        subsets(nums,temp,0,result);        return result;    }    void subsets(vector<int>& nums,vector<int> temp,int size,vector<vector<int> >& result){        if(size==nums.size()){            //插入元素的时候判重            int flag=0;            for(int i=0;i<result.size();i++){                //首先判断长度                if(temp.size()!=result[i].size()) continue;                //对于每一个判断每一个元素                int j=0;                for(;j<result[i].size() && temp[j]==result[i][j];j++);                if(j==result[i].size()){                    flag=1;break;                }            }            if(!flag) result.push_back(temp);            return;        }        subsets(nums,temp,size+1,result);        temp.push_back(nums[size]);        subsets(nums,temp,size+1,result);        temp.pop_back();    }};
0 0
原创粉丝点击