1.全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列
思路:用set去重
void traceback(vector<int>& nums, vector<int>& temp, vector<int>& flag, set<vector<int>>& s)
{
if(temp.size() == nums.size())
{
s.insert(temp);
return;
}
for(int i = 0; i < nums.size(); i++)
{
if(flag[i] != 1)
{
temp.push_back(nums[i]);
flag[i] = 1;
traceback(nums, temp, flag, s);
flag[i] = 0;
temp.pop_back();
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<int> temp;
vector<vector<int>> res;
set<vector<int>> s;
vector<int> flag(nums.size(), 0);
traceback(nums, temp, flag, s);
for(set<vector<int>>::iterator it = s.begin(); it != s.end(); it++)
{
res.push_back(*it);
}
return res;
}
2.旋转图像
给定一个n×n的二维矩阵表示一个图像。
将图像逆时针旋转90度。
说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
思路:先沿主对角线翻转,再以中间为轴上下翻转
沿对角线翻转时,坐标关系为
matrix[i][j] <-> matrix[n - 1 - j][n - 1- i]
void rotate(vector<vector<int>>& matrix) {
//获取矩阵维数
int n = matrix.size();
//以对角线为轴进行翻转
for(int i = 0; i < n - 1; i++)
{
for(int j = 0; j < n - i; j++)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][n - 1- i];
matrix[n - 1 - j][n - 1- i] = temp;
}
}
//以中间横轴上下翻转
for(int i = 0; i < n / 2; i++)
{
for(int j = 0; j < n; j++)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = temp;
}
}
}
或每次交换四个数字
或先转置,然后每行翻转