格雷码转换本来是由一定规律的,但这里使用回溯法实现,具体解释在代码中有。注意n输入的是有多少位。
classSolution {
public:
vector
bitset<32> bits;//32位,每一位默认为0。
vector
help(bits,result,n);
return result;
}
void help(bitset<32>& bits,vector
if(k==0){
res.push_back(bits.to_ulong());//需要将bits转换成无符号整数
}
else{
help(bits,res,k-1);// 考虑位反转第k-1的情况
bits.flip(k-1);//反转第 k-1位,
help(bits,res,k-1);//考虑反转第k-1位的情况
}
}
};
题目:全排列问题。通过交换每两个元素来实现。(元素不重复)
classSolution {
public:
vector
vector
vector
if(nums.empty()){
return res;
}
help(nums,0,one,res);
return res;
}
void help(vector
if(k==nums.size()){
res.push_back(one);
return;
}
for(int i=k;i swap(one[k],one[i]);//交换第k和元素和其他元素 help(nums,k+1,one,res);//第k处交换完之后,交换k+1和它之后的元素 swap(one[k],one[i]);//交换回来 } } }; 77.combinations即给定n和k,k代表从1~n中取出k个数 classSolution { public: vector vector if(k>n||k<=0||n<=0){ return res; } vector help(n,1,k,one,res); return res; } void help(int n, int start, int k,vector //终止条件,k变成0,说明个数已经达到要求了。 if(k==0){ res.push_back(one); return; } for(int i=start;i<=n;i++){ one.push_back(i); help(n,i+1,k-1,one,res);//由于i位置考虑过了,那么下一个考虑的位置 //应该是i+1,如果把i+1改成start+1,那么将会导致可以取出同一个元素多次。 one.pop_back(); } } }; 78.子集合问题(集合元素不重复) 注意包括空集合 classSolution { public: vector vector if(nums.empty()){ return res; } vector res.push_back(one); help(nums,0,one,res); return res; } void help(vector for(inti=start;i one.push_back(nums[i]); res.push_back(one); help(nums,i+1,one,res);//注意这里是i+1. one.pop_back(); } } }; 90子集合问题(集合元素可能重复) classSolution { public: vector vector if(nums.empty()){ return res; } sort(nums.begin(),nums.end());//由于可能含有重复的,所以进行排序,进行后序处理 vector res.push_back(one); help(nums,one,res,0); return res; } //help函数可以理解从start处开始进行考虑,函数内的for循环表示遍历从start开始的所有位的情况, //因此考虑完i位置的元素之后,应该从i+1位置继续考虑,递归完成。而由于元素可能相同,因此, //后面重复的元素值的情况已经被之前相同元素的值考虑过了,直接跳过。 比如【2,2,3】{ 考虑第一个2:[2][2,2][2,3][2,2,3] 第二个2的时候【2】,【2,3】重复了 第三个元素:【3】 } void help(vector if(start>=nums.size()){ return; } for(int i=start;i if(i>start&&nums[i]==nums[i-1]){ continue; } one.push_back(nums[i]); res.push_back(one); help(nums,one,res,i+1); one.pop_back(); } } }; 17,电话号码的组合问题,即2-“abc”,3-"def"等,输入一组号码,输出可能的组合。 class Solution{ 这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数. class Solution {
public:
vector
vector
if(digits.empty()){
return res;
}
string one;
help(digits,one,res,0);
return res;
}
void help(string digits, string& one,vector
if(start==digits.size()){
res.push_back(one);
return;
}
string letters=keys[digits[start]-'0'];
for(int i=0;i<letters.size();i++){
one.push_back(letters[i]);
help(digits,one,res,start+1);//注意这里是start+1,因为//start位置已经全部考虑过了。
one.pop_back();
}
}
private:
stringkeys[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
};
47全排列问题(元素可能重复)
public:
vector
sort(nums.begin(), nums.end());
vector
permutation(nums, 0,result);
return result;
}
private:
void permutation(vector
if (start>= nums.size() -1) {
result.push_back(nums);
return;
}
for (int i = start; i
for(int j = ind; j < i; j++) {
if(nums[j] == nums[i]) {
duplicate = true;
break;
}
}
if(!duplicate) {
swap( nums[start],nums[i]);
permutation(nums, ind+1, result);
swap(nums[i], nums[start]);
}
}
}
};
public:
vector
vector
if(candidates.empty()){
return res;
}
sort(candidates.begin(),candidates.end());
vector
int currentsum=0;
help(candidates,target,currentsum,one,res,0);
return res;
}
void help(vector
if(target==currentsum){
res.push_back(one);
return;
}
else if(currentsum>target){
return;
}
for(int i=index;i
continue;
}
one.push_back(candidates[i]);
currentsum+=candidates[i];
help(candidates,target,currentsum,one,res,i+1);
one.pop_back();
currentsum-=candidates[i];
}
}
};
class TrieNode{
public:
bool is_end;
vector
class Solution {
public:
vector
void dfs(int index, string& s, vector
37填数独矩阵
class Solution {
public:
void solveSudoku(vector