lintcode:子集 & 帶重復元素的子集
阿新 • • 發佈:2018-02-11
rac push_back subset style () col numbers 篩選 with
地址:
http://lintcode.com/zh-cn/problem/subsets/
http://lintcode.com/zh-cn/problem/subsets-ii/
子集
其實就是一顆子集樹
class Solution { public: vector<vector<int>> res; vector<int> judge; int len; /* * @param nums: A set of numbers * @return: A list of lists */ vector<vector<int>> subsets(vector<int> &nums) { // write your code here len = nums.size(); for(int i=0;i<len;i++){ judge.push_back(0); } backtrack(0,nums); return res; } void display(vector<int> &nums){ vector<int> cur; for(int i=0;i<len;i++){ if(judge[i]==1){ cur.push_back(nums[i]); } } res.push_back(cur); } void backtrack(int t,vector<int> &nums){ if(t >= len){ display(nums); return; } for(int i=0;i<=1;i++){ judge[t] = i; backtrack(t+1,nums); } } };
帶重復元素的子集
篩選一下分支,排序數組,然後相同的元素只能出現1,...,0...或者全1、全0的形式,也就是不能有101這樣的情況,
class Solution { public: vector<vector<int>> res; vector<int> judge; int len; /* * @param nums: A set of numbers. * @return: A list of lists. All valid subsets. */ vector<vector<int>> subsetsWithDup(vector<int> &nums) { // write your code here len = nums.size(); sort(nums.begin(),nums.end()); for(int i=0;i<len;i++){ judge.push_back(0); } backtrack(0,nums); return res; } void display(vector<int> &nums){ vector<int> cur; for(int i=0;i<len;i++){ if(judge[i]==1){ cur.push_back(nums[i]); } } res.push_back(cur); } bool isOk(int t,vector<int> &nums){ int count=1; for(int i=0;i<t;i++){ if(nums[i]==nums[i+1]){ if(judge[i]==0){ count = 0; } else { count = 1; } if(!count && judge[i+1] ){ return false; } } else { count=1; } } return true; } void backtrack(int t,vector<int> &nums){ if(t >= len){ display(nums); return; } for(int i=0;i<=1;i++){ judge[t] = i; if(isOk(t,nums)){ backtrack(t+1,nums); } } } };
lintcode:子集 & 帶重復元素的子集