矩阵的几种基础变换

一、转置

java 复制代码
for (int i = 0; i < n; i++)
    for (int j = i+1; j < n; j++)   // 只遍历上三角,避免重复交换
        swap(matrix[i][j], matrix[j][i]);

867. 转置矩阵 - 力扣(LeetCode)

二、翻转

水平翻转(左右翻转)

java 复制代码
public void horizontalFlip(int[][] matrix) {
    int n = matrix.length;
    for (int i = 0; i < n; i++) {
        int[] row = matrix[i];
        for (int j = 0; j < n / 2; j++) {   // 只走到一半,避免换两次
            int tmp = row[j];
            row[j] = row[n - 1 - j];
            row[n - 1 - j] = tmp;
        }
    }
}

垂直翻转(上下翻转)

写法一:原地,交换行内元素

java 复制代码
public void verticalFlip(int[][] matrix) {
    int n = matrix.length;
    int m = matrix[0].length;
    for (int i = 0; i < n / 2; i++) {
        for (int j = 0; j < m; j++) {
            int tmp = matrix[i][j];
            matrix[i][j] = matrix[n - 1 - i][j];
            matrix[n - 1 - i][j] = tmp;
        }
    }
}

写法二:原地,交换整行引用

java 复制代码
public void verticalFlip(int[][] matrix) {
    int n = matrix.length;
    for (int i = 0; i < n / 2; i++) {
        int[] tmp = matrix[i];
        matrix[i] = matrix[n - 1 - i];
        matrix[n - 1 - i] = tmp;
    }
}

三、旋转

顺时针90° = 转置+每行左右翻转

逆时针90° = 转置+每行上下翻转

48. 旋转图像 - 力扣(LeetCode)

旋转180° = 中心对称 = 水平翻转+垂直翻转

因为 180° 是中心对称,每对元素只交换一次。遍历左上四分之一区域即可避免重复:

java 复制代码
public void rotate180(int[][] matrix) {
    int n = matrix.length;
    for (int i = 0; i < (n + 1) / 2; i++) {
        for (int j = 0; j < n / 2; j++) {
            int tmp = matrix[i][j];
            matrix[i][j] = matrix[n - 1 - i][n - 1 - j];
            matrix[n - 1 - i][n - 1 - j] = tmp;
        }
    }
}
相关推荐
写后端的胖头鱼2 小时前
如何区分IO/CPU 密集型,线程池核心参数怎么设置
java·线程池·多线程·io密集·cpu密集
mmmmath_32 小时前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Selvaggia2 小时前
DMD(Distribution Matching Distillation,分布匹配蒸馏)
算法
JAVA面经实录9172 小时前
IDEA 开发知识
java·intellij-idea·idea
于樱花森上飞舞2 小时前
【Redis】哨兵详解
java·开发语言·数据库·redis
Navigator_Z2 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.2 小时前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
2601_953824613 小时前
基于SSM的水果超市管理系统
java·tomcat·maven
guo_wen_qiang3 小时前
springboot如何自定义一个启动器starter
java·spring boot·intellij-idea