Leetcode 832.翻转图像 2021.02.24

Leetcode 832.翻转图像 2021.02.24

二月 24, 2021

832.翻转图像

  • 难度:简单

给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]

反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]

示例

示例1:

输入:[[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]

示例2:

输入:[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释:首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]

说明

  • 1 <= A.length = A[0].length <= 20
  • 0 <= A[i][j] <= 1

思路

  • 双指针

    1. 遍历数组A
    2. 左指针指向数组a头,右指针指向数组b的尾
    3. 左指针赋值到临时变量temp中
    4. 取反的右指针赋值到左指针
    5. 取反的临时变量temp赋值到右指针
    6. 左指针右移
    7. 右指针左移
    8. 直至左指针大于右指针
  • 无敌外挂大法

    1. 逐位求反
    2. 调用STL中的alalgorithm库中的reverse()函数反转数组

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//双指针大法好
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
//遍历数组A
for(auto &a : A){
//左指针指向数组a头,右指针指向数组b的尾
int left = 0;
int right = a.size()-1;

//直至左指针大于右指针
while(left<=right){
//左指针赋值到临时变量temp中
int temp = a[left];
//取反的右指针赋值到左指针
a[left] = !a[right];
//取反的临时变量temp赋值到右指针
a[right] = !temp;

//左指针右移
left++;
//右指针左移
right--;
}
}
return A;
}

//无敌外挂
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
//逐位求反
for(auto &a :A){
for(auto &aa:a){
aa = !aa;
}
}

//调用STL中的alalgorithm库中的`reverse()`函数反转数组
for(auto &a : A){
reverse(a.begin(),a.end());
}
return A;
}