48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:


输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:

图2:


输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

解题思路

  1. 以图2 为例子
  2. 先自定义一个Point类,用于保存二维数组中的元素的下标位置
  3. 根据题意可理解为 :如图2:第一行的第一个元素,第四列第一个元素,第四行第四个元素,第四行第一个元素为一组 做旋转操作,用到一个辅助空间
  4. 然后 又到第分二组的四个数,即第一行的第个元素,第四列第个元素,第四行第个元素,第行第一个元素为一组 做旋转操作,用到一个辅助空间 
  5. 依次把外层的每个分组的元素旋转,然后到内层 即可完成本题
class Point{
    int x,y;
    public Point(int x,int y){
        this.x=x;
        this.y=y;
    }
    Point(){}
    public void setPoint(int x,int y){
        this.x=x;
        this.y=y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}
public class LK48 {
   static public void rotate(int[][] matrix) {
        int temp=-1,n=matrix.length;
        Point point[]=new Point[4];
        for (int i=0;i<4;i++)
            point[i]=new Point();
        int t1=n%2==0?n/2:n/2+1;
        for (int j=0;j<t1;j++) {
            point[0].setPoint(0+j,0+j);
            point[1].setPoint(n-1-j,0+j);
            point[2].setPoint(n-1-j,n-1-j);
            point[3].setPoint(0+j,n-1-j);
            int len=point[1].x-point[0].x;
            for (int i = 0; i < len ; i++){
                temp = matrix[point[0].y][point[0].x];
                matrix[point[0].y][point[0].x] = matrix[point[3].y][point[3].x];
                matrix[point[3].y][point[3].x] = matrix[point[2].y][point[2].x];
                matrix[point[2].y][point[2].x] = matrix[point[1].y][point[1].x];
                matrix[point[1].y][point[1].x] = temp;
                point[0].setPoint(point[0].getX()+1, point[0].getY() );
                point[1].setPoint(point[1].getX() , point[1].getY()+1);
                point[2].setPoint(point[2].getX()-1, point[2].getY() );
                point[3].setPoint(point[3].getX() , point[3].getY()-1);
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值