二维数组6:数组的水平翻转

数组翻转就是将数组整体做顺/逆时针旋转90度或者180度,由于旋转180就是对称,没啥难度,所以常见的题目还是以旋转90度比较多。

LeetCode的48题就是这样的题目:有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。

这个题有多种处理方式,我们分别来看:

1 一层一层循环,坐标变换

还是定义三个位置,一圈写一轮的元素位置变化,比如A移动到B,B移动到C,C移动到D,那么另tmp=D,就可以先将C移动到D,然后将B移动到C,再将B移动到B,最后将tmp赋值给A,一圈圈进行,这里也要非常小心边界的判断:

import java.util.*;

public class Solution {
   public int[][] rotateMatrix(int[][] mat, int n) {
       int tR=0;
       int tC=0;
       int dR=n-1;
       int dC=n-1;
       while(tR<dR){
           for(int i=0;i<dC-tC;i++){
               int tmp=mat[tR][tC+i];
               mat[tR][tC+i]=mat[dR-i][tC];
               mat[dR-i][tC]=mat[dR][dC-i];
               mat[dR][dC-i]=mat[tR+i][dC];
               mat[tR+i][dC]=tmp;
          }
           tR++;
           tC++;
           dR--;
           dC--;
      }
       return mat;
  }
}

2 根据数学规律进行

mat[i]被旋转到了mat[j]的位置是有数学公式可以用的,如果知道的话就可以直接写代码了:

import java.util.*;

public class Rotate {
   public int[][] rotateMatrix(int[][] mat, int n) {
       // write code here
       int[][] temp=new int[n][n];

       for(int i=0;i<n;i++)
      {
           for(int j=0;j<n;j++)
          {
               temp[j][n-1-i]=mat[i][j];              
          }
      }      
       return temp;  
  }
}

这种方式我觉得并不适合在面试的时候说,首先很明显除非提前知道公式,否则很难在面试的时候找到这个规律。

更尴尬的是,如果快速将上面的代码写出来了,面试官肯定知道你刷过了,所以很可能会再找个算法题让你做,郁闷不?

3 两次翻转法

先沿左上-右下的对角线翻转,再沿竖直中线上下翻转。如下图所示,这种效果也可以实现旋转90度的效果。

这个还比较好写的:

import java.util.*;
public class Rotate {
   public int[][] rotateMatrix(int[][] mat, int n) {
       // write code here

       // 对角线
       for(int i=0; i<n;i++) {
           for(int j=i+1; j< n; j++) {
               int temp = mat[i][j];
               mat[i][j] = mat[j][i];
               mat[j][i] = temp;
          }
      }

       // 以横轴翻转
       for(int i=0;i<n;i++) {
           for(int j=0; j< n/2; j++) {
               int temp = mat[i][j];
               mat[i][j] = mat[i][n-1-j];
               mat[i][n-1-j] = temp;
          }
      }
       return mat;
  }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵横千里,捭阖四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值