这里给出两种方法
方法一,利用上一题那个数字序列问题,把数字序列作为给定数组的下标来组成新数组,当元素填满时,将其中元素作为下标,换成nums中的对应元素即可
1 class Solution 2 { 3 public: 4 vector<vector<int>> subsets(vector<int>& nums) 5 { 6 vector<vector<int>> res; 7 vector<int> em; 8 res.push_back(em); 9 int sz=nums.size(); 10 for(int k=1;k<=sz;k++) 11 { 12 int i=0; 13 vector<int>cur(k,0); 14 while(i>=0) 15 { 16 cur[i]++; 17 if(cur[i]>sz) 18 i--; 19 else if(i==k-1) 20 { 21 vector<int> curcopy=cur; 22 for(int &j:curcopy) 23 j=nums[j-1]; 24 res.push_back(curcopy); 25 } 26 else 27 { 28 i++; 29 cur[i]=cur[i-1]; 30 } 31 } 32 } 33 return res; 34 } 35 };
方法二,深度优先搜索,一级一级往下找,找到数组末尾时,返回即可
1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 vector<vector<int>> res; 5 dfs(nums, 0, {}, res); 6 return res; 7 } 8 void dfs(vector<int> &nums, int i, vector<int> cur, vector<vector<int>> &res) { 9 if (i == nums.size()) { 10 res.push_back(cur); 11 return; 12 } 13 dfs(nums, i+1, cur, res); 14 cur.push_back(nums[i]); 15 dfs(nums, i+1, cur, res); 16 } 17 };
方法三、回溯法
1 class Solution { 2 public: 3 void backtrack(vector<vector<int>>& sets, vector<int>& temp, vector<int>& nums, int s) 4 { 5 sets.push_back(temp); 6 for(int i = s; i < nums.size(); i++) 7 { 8 temp.push_back(nums[i]); 9 backtrack(sets, temp, nums, i+1); 10 temp.pop_back(); 11 } 12 } 13 14 vector<vector<int>> subsets(vector<int>& nums) { 15 vector<vector<int>> sets; 16 vector<int> temp; 17 backtrack(sets, temp, nums, 0); 18 return sets; 19 20 } 21 };
浙公网安备 33010602011771号