力扣第48题 中等难度 旋转图像(必须原地)

先看一眼题:
在这里插入图片描述

思路:仅额外使用一个数的空间(temp)完成旋转
首先定义四个顶点(a1,b1),(a2,b2),(a3,b3),(a4,b4)分别为数组最外一圈的左上角、右上角、右下角和左下角。
然后开始旋转这一圈。
旋转时,开辟了一个temp用来旋转,旋转时需要有进行交换位置的操作,因此使用了swap来辅助完成交换位置
当本圈旋转结束后,开始旋转更里面的一圈。
当四个顶点都指向一个位置的时候(边长为奇数),或者b1 - 1 == b2(边长为偶数)时,所有圈均完成旋转。
代码如下:

//48.旋转图像
//注:必须原地旋转
public class Solution48 {
    public void rotate(int[][] matrix) {
        __rotate(0,matrix);
    }

    public void __rotate(int start, int[][] matrix) {
        //四条边的起始点,对应四条边,分别用一条边来保存四条边,然后依次旋转覆盖。
        //如果四条边的起始点相同,则说明这是最后一次调用本方法
        //四个点分别为(a1,b1),(a2,b2),(a3,b3),(a4,b4)
        int a1 = start, b1 = start;
        int a2 = start, b2 = matrix.length - start - 1;
        int a3 = matrix.length - start - 1, b3 = matrix.length - start - 1;
        int a4 = matrix.length - start - 1, b4 = start;

        if (a2 == a3 || b1 - 1 == b2)//最后一次调用
            return;
        //int[] edge = new int[matrix.length];
        int temp; //其实用一个数也可以代替edge的工作,这样就是O(1)的空间复杂度啦
        //开始旋转覆盖
        for (int i = a2, j = b1, k = b3, l = a4; i < a3; i++, j++, k--, l--) {
            temp = matrix[i][b2];
            matrix[i][b2] = matrix[a1][j];

            int swap = temp;
            temp = matrix[a3][k];
            matrix[a3][k] = swap;

            swap = temp;
            temp = matrix[l][b4];
            matrix[l][b4] = swap;

            swap=temp;
            temp = matrix[a1][j];
            matrix[a1][j]=swap;
        }
        __rotate(++start,matrix);
    }
}

运行效率:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值