LeetCode偶尔一题 —— 832. 翻转图像

题目描述

分析题目

按照题意咱们只要先对每一个子数组先作逆序,再作 0 --> 1 和 1 --> 0 的替换便可,因而咱们能够写出如下代码:javascript

/**
 * @param {number[][]} A
 * @return {number[][]}
 */
var flipAndInvertImage = function(A) {
    for (let i = 0; i < A.length; i++) {
        let j = 0, k = A[i].length - 1
        while (j < k) {
            [A[i][j], A[i][k]] = [A[i][k], A[i][j]]
            A[i][j] = A[i][j] ? 0 : 1
            A[i][k] = A[i][k] ? 0 : 1
            j++, k--
        }
        if (j === k) {
            A[i][j] = A[i][j] ? 0 : 1
        }
    }
    return A
};

优化

对于 0 --> 1 和 1 --> 0 的替换,咱们大可没必要用三元运算符,而是采用异或运算,能够把代码简化以下:前端

/**
 * @param {number[][]} A
 * @return {number[][]}
 */
var flipAndInvertImage = function(A) {
    for (let i = 0; i < A.length; i++) {
        let j = 0, k = A[i].length - 1
        while (j < k) {
            [A[i][j], A[i][k]] = [A[i][k], A[i][j]]
            A[i][j] ^= 1
            A[i][k] ^= 1
            j++, k--
        }
        if (j === k) {
            A[i][j] ^= 1
        }
    }
    return A
};

进阶

仔细观察题目中提供的测试用例,咱们发现,左右两个数不相等时能够直接忽略,因而最终版的程序以下:java

/**
 * @param {number[][]} A
 * @return {number[][]}
 */
var flipAndInvertImage = function(A) {
    for (let i = 0; i < A.length; i++) {
        let j = 0, k = A[i].length - 1
        while (j < k) {
            if (A[i][j] === A[i][k]) {
                A[i][j] ^= 1
                A[i][k] ^= 1
            }
            j++, k--
        }
        if (j === k) {
            A[i][j] ^= 1
        }
    }
    return A
};
  • 时间复杂度O(n * k / 2)
  • 空间复杂度O(1)

原题地址: https://leetcode-cn.com/probl...
代码不定时更新,欢迎 star 个人 repogit

扫描下方的二维码或搜索「tony老师的前端补习班」关注个人微信公众号,那么就能够第一时间收到个人最新文章。
github

相关文章
相关标签/搜索