非最优解,仅记录学习。
算法思路;
其实为对半互换,只看一半元素(n/2个元素)就行
双层循环,外层控制行数,内层控制当前行元素调换并反转(1减法);
以n/2为界,循环遍历下标++,每次调换并反转[i][j]和[i][n-j-1]。
奇数n需要特殊处理,由于只每次j<n/2,中间一列不会被调换故需单独反转。
/*
*/
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
int m=image.size(),n=image[0].size(),t;
for(int i=0;i<m;i++){
int j;
for(j=0;j<n/2;j++){
t=1-image[i][j];
image[i][j]=1-image[i][n-j-1];//!n-j-1而非n-1
image[i][n-j-1]=t;
}
if(n%2!=0){
//若列为基数则需要再单独反转中间一列
image[i][j]=1-image[i][j];//!for循环出来j为n/2,不满足条件但是依旧自增。
}
}
return image;
}
};