832. 翻转图像 - 力扣

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;
    }
};

摘抄自:官方题解

上述每个元素是否都需交换和替换,是不是都必要捏?答案是:不是的。

  • 情况一:imageileft = 0,imageiright = 0。对第 i 行进行水平翻转之后,imageileft = 0,imageiright = 0。进行反转之后,imageileft = 1,imageiright = 1。
  • 情况一:imageileft = 1,imageiright = 1。对第 i 行进行水平翻转之后,imageileft = 1,imageiright = 1。进行反转之后,imageileft = 0,imageiright = 0。
  • 情况一:imageileft = 0,imageiright = 1。对第 i 行进行水平翻转之后,imageileft = 1,imageiright = 0。进行反转之后,imageileft = 0,imageiright = 1。
  • 情况一:imageileft = 1,imageiright = 0。对第 i 行进行水平翻转之后,imageileft = 0,imageiright = 1。进行反转之后,imageileft = 1,imageiright = 0。

情况一和情况二是 imageileft = imageiright 的情况。在进行水平翻转和反转之后,imageileft 和 imageiright 的元素值都发生了改变,即元素值被反转。

情况三和情况四是 imageileft ≠ imageiright 的情况。在进行水平翻转和反转之后,imageileft 和 imageiright 的元素值都发生了两次改变,恢复原状。

所以当 left<right 时,判断 imageileft 和 imageiright 是否相等,如果相等则对 imageileft 和 imageiright 的值进行反转,如果不相等则不进行任何操作。

并且采用 ^ 运算符进行水平翻转和反转操作:

  • 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)

相关推荐
数据仓库搬砖人2 分钟前
SHAP 详解:从博弈论原理到 XGBoost 实战
算法
老鱼说AI2 分钟前
统计学习方法第七章:支持向量机精讲(超硬核长文深入预警!)
人工智能·深度学习·神经网络·算法·机器学习·支持向量机·学习方法
容器魔方5 分钟前
KubeEdge SIG AI: 基于KubeEdge-Ianvs的大模型联邦微调算法
大数据·人工智能·算法·云原生·容器·云计算
列星随旋14 分钟前
矩阵快速幂
java·算法·矩阵
z2005093016 分钟前
今日算法(回溯全排列)
c++·算法·leetcode
Boom_Shu17 分钟前
构造函数程序
数据结构·算法
MicroTech202524 分钟前
微算法科技(NASDAQ: MLGO)量子安全与区块链:量子神经网络QNN赋能动态共识与量子密钥分发
科技·算法·安全
sali-tec41 分钟前
C# 基于OpenCv的视觉工作流-章81-弯脚检测
图像处理·人工智能·opencv·算法·计算机视觉
kkeeper~42 分钟前
0基础C语言积跬步之自定义类型联合和枚举
c语言·开发语言·算法
昵称好难啊43 分钟前
4.OpenClaw源码解析_路由的概念
人工智能·算法