题目中要求先将二维数组中每一行中的元素调换位置(即翻转每一行),然后再将0转化为1,将1转化为0(反转图片)。
身为菜鸡的我每次第一个想法总是暴力方法。也就是传说中的双重for循环,但是值得表扬的是我在里层循环中只循环一半,大大减小了时间复杂度,将原来O(n2)变为O(1/2 * n2) 。嗯~~~满足(^_^)
代码如下
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int temp = 0; //作为中间变量
for(int i = 0; i < A.length; i++){ //传统暴力方法循环调换位置
for(int j = 0; j < A[0].length / 2; j++){ //这里只循环一半就可以
temp = A[i][j] ;
A[i][j] = A[i][(A[0].length - 1 - j)];
A[i][A[0].length - j - 1] = temp;
}
}
}
for(int i = 0; i < A.length; i++){ //反转图片
for(int j = 0; j < A[0].length; j++){
if(A[i][j] == 0){
A[i][j] = 1;
}
else{
A[i][j] = 0;
}
}
}
return A;
}
}
当然时间复杂度还是有些高………… 想办法将第二个for循环中的内容加到第一个里面。。。嗯,难(55555)。
当我看到别人的解题思路时顿时茅塞顿开。他的思路是应用异或这个逻辑方法。比如1 ^ 1 = 0 , 0 ^ 1 = 1;
代码如下
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int temp = 0;
if(A[0].length == 1){ //判断如果二维数组中只有一个数时 千万不能让他进入循环 因为循环不到
A[0][0] = A[0][0] ^ 1; //如果这个数组元素是1时,再与1异或就等于0 如果是0与1异或就是1(好聪明,我)
}
else{
for(int i = 0; i < A.length; i++){
if(A[0].length % 2 != 0){ //如果每一行元素是奇数,由于循环不到这个数(最中间的数),所以我们直接处理这一个就行
A[i][A.length / 2] = A[i][A.length / 2] ^ 1;
}
for(int j = 0; j < A[0].length / 2; j++){ //接着处理剩下的数就行 方法同上 用异或
temp = A[i][j] ^ 1;
A[i][j] = A[i][(A[0].length - 1 - j)] ^ 1;
A[i][A[0].length - j - 1] = temp;
}
}
}
return A;
}
}
至此解题完毕
但是想起自己的暴力解决方法时