【简单】将正方形矩阵顺时针转动90度-Java

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程

package live.every.day.ProgrammingDesign.CodingInterviewGuide.ArrayAndMatrix;

import java.util.Arrays;

/**
 * 将正方形矩阵顺时针转动90度
 *
 * 【题目】
 * 给定一个NXN的矩阵matrix,把这个矩阵调整成顺时针转动90°后的形式。
 *
 * 【要求】
 * 额外空间复杂度为O(1)。
 *
 * 【难度】
 * 简单
 *
 * 【解答】
 * 这里仍使用分圈处理的方式,在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵。比如,题目中的矩
 * 阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。
 * 1  2  3  4
 * 5        8
 * 9        12
 * 13 14 15 16
 * 在这个外圈中,1,4,16,13为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。
 * 然后2,8,15,9为一组,继续占据调整的过程,最后3,12,14,5为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、
 * (dR,dC)=(3,3)的子矩阵外层就调整完毕。接下来令tR和tC加1,即(tR,tC)=(1,1),令dR和dc减1,即(dR,dC)=(2,2),此时
 * 表示的子矩阵如下。
 * 6  7
 * 10 11
 * 这个外层只有一组,就是6,7,11,10,占据调整之后即可。所以,如果子矩阵的大小是MxM,一共就有M-1组,分别进行占据调整即
 * 可。
 * 具体过程请参看如下代码中的rotate方法。
 *
 * @author Created by LiveEveryDay
 */

public class RotateSquareMatrix90Degree {

    public static void rotate(int[][] m) {
        int tR = 0;
        int tC = 0;
        int dR = m.length - 1;
        int dC = m[0].length - 1;
        while (tR < dR) {
            rotateEdge(m, tR++, tC++, dR--, dC--);
        }
    }

    private static void rotateEdge(int[][] m, int tR, int tC, int dR, int dC) {
        int times = dC - tC; // 总的组数
        int tmp = 0;
        for (int i = 0; i != times; i++) { // 一次循环就是一组占据调整
            tmp = m[tR][tC + i];
            m[tR][tC + i] = m[dR - i][tC];
            m[dR - i][tC] = m[dR][dC - i];
            m[dR][dC - i] = m[tR + i][dC];
            m[tR + i][dC] = tmp;
        }
    }

    public static void main(String[] args) {
        int[][] m = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
        rotate(m);
        for (int[] i : m) {
            System.out.println(Arrays.toString(i));
        }
    }

}

// ------ Output ------
/*
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]
[16, 12, 8, 4]
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值