首页 > 其他分享 >[Leetcode] 0832. 翻转图像

[Leetcode] 0832. 翻转图像

时间:2023-10-30 15:22:35浏览次数:44  
标签:反转 image 图像 List 0832 翻转 Leetcode row

832. 翻转图像

题目描述

给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。

  • 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]

反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。

  • 例如,反转 [0,1,1] 的结果是 [1,0,0]

 

示例 1:

输入:image = [[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:

输入:image = [[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]]

 

提示:

  • n == image.length
  • n == image[i].length
  • 1 <= n <= 20
  • images[i][j] == 0 或 1.

解法

方法一:双指针

我们可以遍历矩阵,对于遍历到的每一行 \(row\):

我们使用双指针 \(i\) 和 \(j\) 分别指向该行的首尾元素,如果 \(row[i] = row[j]\),交换后两者的值仍然保持不变,因此,我们只需要对 \(row[i]\) 和 \(row[j]\) 进行异或反转即可,然后将 \(i\) 和 \(j\) 分别向中间移动一位,直到 \(i \geq j\)。如果 \(row[i] \neq row[j]\),此时交换后再反转两者的值,仍然保持不变,因此,可以不进行任何操作。

最后,如果 \(i = j\),我们直接对 \(row[i]\) 进行反转即可。

时间复杂度 \(O(n^2)\),其中 \(n\) 是矩阵的行数或列数。
空间复杂度 \(O(1)\)。

Python3

class Solution:
    def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
        n = len(image)
        for row in image:
            i, j = 0, n - 1
            while i < j:
                if row[i] == row[j]:
                    row[i] ^= 1
                    row[j] ^= 1
                i, j = i + 1, j - 1
            if i == j:
                row[i] ^= 1
        return image

C++

class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
        for (auto& row : image) {
            int i = 0, j = row.size() - 1;
            for (; i < j; ++i, --j) {
                if (row[i] == row[j]) {
                    row[i] ^= 1;
                    row[j] ^= 1;
                }
            }
            if (i == j) {
                row[i] ^= 1;
            }
        }
        return image;
    }
};

标签:反转,image,图像,List,0832,翻转,Leetcode,row
From: https://www.cnblogs.com/yege/p/17797938.html

相关文章

  • 【算法题】翻转对
    题目:给定一个数组nums,如果i<j且nums[i]>2*nums[j]我们就将(i,j)称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。示例1:输入:[1,3,2,3,1]输出:2示例2:输入:[2,4,3,5,1]输出:3注意:给定数组的长度不会超过50000。输入数组中的所有数字都在32......
  • [Leetcode] 0830. 较大分组的位置
    830.较大分组的位置题目描述在一个由小写字母构成的字符串s中,包含由一些连续的相同字符所构成的分组。例如,在字符串s="abbxxxxzyy" 中,就含有"a","bb","xxxx","z"和"yy"这样的一些分组。分组可以用区间[start,end]表示,其中start和end分别表示该分组的起始......
  • leetcode(力扣) 128. 最长连续序列(哈希)
    文章目录题目描述思路分析完整代码题目描述给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。......
  • LeetCode每日算法2—两数相加
    题目描述给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字0之外,这两个数都不会以0开头。示例输入:(2......
  • LeetCode459.重复的子字符串
    题目描述给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。示例提交的代码十五分钟内没想出来怎么解决,没代码:(学习到的东西因为个人没有想出来怎么解决,看的是Carl大神的解法,地址我放在下面:移动匹配以及KMP解此题然后我写一下我个人理解的地方吧,记录......
  • 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表
    一、链表结构1.单向链表节点结构publicclassNode{ publicintvalue;publicNodenext;publicNode(intdata){value=data;}}2.双向链表节点结构publicclassDoubleNode{publicintvalue;publicDoubleNodelast;publicDouble......
  • 数据结构与算法(LeetCode)第一节:认识复杂度,对数器,二分法与异或运算
    一、认识复杂度1.评估算法优劣的核心指标:时间复杂度:当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉,记为O(去掉系数的高阶项);​ 时间复杂度是衡量算法流程的复杂度的一种指标,该指标只与数据量有关,与过程之外的优化无关常见的时间复杂度(从好到坏)O......
  • LeetCode 11. 盛最多水的容器
    盛水最多的容器题目链接11.盛最多水的容器给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。**说明:**你不能倾斜容器。示例1:......
  • LeetCode 202. 快乐数
    快乐数题目链接202.快乐数编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为1,那么这个数就是快乐数。如果n......
  • Leetcode 1089. 复写零
    复写零题目链接1089.复写零给你一个长度固定的整数数组arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组就地进行上述修改,不要从函数返回任何东西。示例1:输入:arr=[1,0,2,3,0,4,5,0]输出:[1,0,0,......