題目描述
分析題目
按照題意我們只要先對每個子數組先做逆序,再做 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] = 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
};
進階
仔細觀察題目中提供的測試用例,我們發現,左右兩個數不相等時可以直接忽略,於是最終版的程序如下:
/**
* @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
我的 repo
掃描下方的二維碼或搜索「tony老師的前端補習班」關注我的微信公衆號,那麼就可以第一時間收到我的最新文章。