[leetcode]78#サブセット(subsets)-再帰
15252 ワード
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析:本題は八皇后問題と類似しており、再帰的に次の問題にアクセスしている.次の図のように、最後にPythonとC++で実装されたコードです.Python
c++メソッド1:
c++メソッド2 1は、配列を並べ替えるのではなく、アクセスした要素2を1つの配列で記録し、最後に出力/格納配列を巡回する
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析:本題は八皇后問題と類似しており、再帰的に次の問題にアクセスしている.次の図のように、最後にPythonとC++で実装されたコードです.Python
class Solution(object):
def subsets(self, nums):
result=[]
def dfs(lst, nums, pos): #pos lst
result.append(lst[:]) #
for i in range(pos,len(nums)):
lst.append(nums[i])
dfs(lst,nums,i+1)
lst.pop() #
dfs([],nums,0)
return result
c++メソッド1:
class Solution {
public:
//
vector<vector<int>> subsets(vector<int>& nums) {
// :
vector<vector<int>> result;
vector<int> path;
// : ,
sort(nums.begin(),nums.end());
result.push_back(path);
dfs(nums,0,path,result);
return result;
}
void dfs(vector<int>& nums,int pos,vector<int> & path,vector<vector<int>> & result)
//num
{
if(pos==nums.size())
return;
//
// :https://blog.csdn.net/lyly1995/article/details/87867340
for(int i=pos;i<nums.size();i++)
{
path.push_back(nums[i]);
result.push_back(path);
dfs(nums,i+1,path,result);
path.pop_back();
}
}
};
c++メソッド2 1は、配列を並べ替えるのではなく、アクセスした要素2を1つの配列で記録し、最後に出力/格納配列を巡回する
class Solution {
public:
int used[1000000];
void search(vector<int>& nums,int idx,vector<int> & path,vector<vector<int>> & result)
{
if(idx>=nums.size()){
for(int i=0;i<nums.size();i++)
{
if(used[i]==1)
path.push_back(nums[i]);
}
result.push_back(path);
path.clear();
return;
}
used[idx]=1;
search(nums,idx+1,path,result);
used[idx]=0;
search(nums,idx+1,path,result);
}
vector<vector<int>> subsets(vector<int>& nums) {
memset(used,0,sizeof(used));
vector<vector<int>> result;
vector<int> path;
search(nums,0,path,result);
return result;
}
};