按照題意咱們只要先對每一個子數組先作逆序,再作 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