1.格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数n,打印其格雷编码序列。格雷编码序列必须以0开头。
思路:格雷编码的生成过程,G(i) = i ^ (i/2)
动态规划问题
vector<int> grayCode(int n) {
vector<int> dp;
dp.push_back(0);
for(int i = 1; i < pow(2,n); i++)
{
dp.push_back(i ^ (i / 2));
}
return dp;
}
2.子集II
给定一个可能包含重复元素的整形数组nums,返回该数组所有可能的子集(幂集)
思路:回溯算法,用set去重
void traceback(vector<int>& nums, vector<int>& temp, set<vector<int>>& s, int start)
{
if(temp.size() <= nums.size())
{
s.insert(temp);
}
for(int i = start; i < nums.size(); i++)
{
//去重
if(i > start && nums[i] == nums[i - 1])
{
continue;
}
temp.push_back(nums[i]);
traceback(nums, temp, s, i + 1);
temp.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> temp;
vector<vector<int>> res;
set<vector<int>> s;
traceback(nums, temp, s, 0);
for(set<vector<int>>::iterator it = s.begin(); it != s.end(); it++)
{
res.push_back(*it);
}
return res;
}