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

相關文章
相關標籤/搜索