1. 题目
给定一个
n x n
的二进制矩阵image
,先 水平 翻转图像,然后 反转 图像并返回 结果 。水平翻转图片就是将图片的每一行都进行翻转,即逆序。
- 例如,水平翻转
[1,1,0]
的结果是[0,1,1]
。反转 图片的意思是图片中的
0
全部被1
替换,1
全部被0
替换。
- 例如,反转
[0,1,1]
的结果是[1,0,0]
。
2. 示例
3. 分析
遍历数组交换左右两个指针元素(水平翻转),同时判断交换后二者元素为1还是为0,进行替换(反转)。
cpp
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
int n = image.size();
for(int i = 0; i < n; i++)
{
int left = 0, right = n-1;
while(left < right)
{
swap(image[i][left], image[i][right]);
if(image[i][left] == 0) image[i][left] = 1;
else image[i][left] = 0;
if(image[i][right] == 0) image[i][right] = 1;
else image[i][right] = 0;
left++;
right--;
}
if(left == right)
{
if(image[i][left] == 1) image[i][left] = 0;
else image[i][left] = 1;
}
}
return image;
}
};
摘抄自:官方题解
上述每个元素是否都需交换和替换,是不是都必要捏?答案是:不是的。
- 情况一:image[i][left] = 0,image[i][right] = 0。对第 i 行进行水平翻转之后,image[i][left] = 0,image[i][right] = 0。进行反转之后,image[i][left] = 1,image[i][right ]= 1。
- 情况一:image[i][left] = 1,image[i][right] = 1。对第 i 行进行水平翻转之后,image[i][left] = 1,image[i][right] = 1。进行反转之后,image[i][left] = 0,image[i][right] = 0。
- 情况一:image[i][left] = 0,image[i][right] = 1。对第 i 行进行水平翻转之后,image[i][left] = 1,image[i][right] = 0。进行反转之后,image[i][left] = 0,image[i][right] = 1。
- 情况一:image[i][left] = 1,image[i][right] = 0。对第 i 行进行水平翻转之后,image[i][left] = 0,image[i][right] = 1。进行反转之后,image[i][left] = 1,image[i][right] = 0。
情况一和情况二是 image[i][left] = image[i][right] 的情况。在进行水平翻转和反转之后,image[i][left] 和 image[i][right] 的元素值都发生了改变,即元素值被反转。
情况三和情况四是 image[i][left] ≠ image[i][right] 的情况。在进行水平翻转和反转之后,image[i][left] 和 image[i][right] 的元素值都发生了两次改变,恢复原状。
所以当 left<right 时,判断 image[i][left] 和 image[i][right] 是否相等,如果相等则对 image[i][left] 和 image[i][right] 的值进行反转,如果不相等则不进行任何操作。
并且采用 ^ 运算符进行水平翻转和反转操作:
- 1 ^ 1 = 0
- 0 ^ 1 = 1
cpp
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
int n = image.size();
for(int i = 0; i < n; i++)
{
int left = 0, right = n-1;
while(left < right)
{
if(image[i][left] == image[i][right])
{
image[i][left] ^= 1;
image[i][right] ^= 1;
}
left++;
right--;
}
if(left == right) image[i][left] ^= 1;
}
return image;
}
};
时间复杂度: O(n2)
空间复杂度: O(1)