这里给出两种方法

方法一,利用上一题那个数字序列问题,把数字序列作为给定数组的下标来组成新数组,当元素填满时,将其中元素作为下标,换成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 };

 

posted on 2018-07-25 11:15  高数考了59  阅读(101)  评论(0)    收藏  举报