按照题意咱们只要先对每一个子数组先作逆序,再作 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