当前位置: 首页 > news >正文

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目,让我们来看看题目描述:

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

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

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

题解

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length; // 获取矩阵的维度 n

        // **第一步:沿主对角线(左上到右下)翻转矩阵**
        // 交换 matrix[i][j] 和 matrix[j][i],即 matrix[i][j] 变为 matrix[j][i]
        for(int i = 0; i < n; i++){ // 遍历每一行
            for(int j = i; j < n; j++){ // 遍历当前行及其右侧部分,确保不重复交换
                int temp = matrix[i][j]; // 暂存 matrix[i][j] 的值
                matrix[i][j] = matrix[j][i]; // 交换两个对称位置的值
                matrix[j][i] = temp; // 赋值完成
            }
        }

        // **第二步:水平翻转每一行**
        // 将每一行的元素进行反转,使得第一列变为最后一列,实现顺时针旋转
        for(int[] row : matrix){
            reverse(row); // 调用 reverse 方法翻转当前行
        }
    }

    // **辅助方法:翻转一维数组**
    // 作用:将传入的数组左右翻转,即第一个元素与最后一个元素交换,第二个与倒数第二个交换,以此类推
    void reverse(int[] arr){
        int i = 0; // 左指针
        int j = arr.length - 1; // 右指针

        // 交换数组的左右对称元素
        while(i < j){
            int temp = arr[i]; // 暂存左侧元素
            arr[i++] = arr[j]; // 右侧元素赋值给左侧,同时左指针右移
            arr[j--] = temp; // 左侧元素赋值给右侧,同时右指针左移
        }
    }
}

题解思路解析

  1. 沿主对角线翻转

    • 交换 (i, j)(j, i) 位置的元素,将行变为列,实现 转置
    • 示例:
	 1  2  3      1  4  7
	 4  5  6  ->  2  5  8
	 7  8  9      3  6  9

  1. 水平翻转每一行

    • 将每一行的元素从左到右翻转,完成最终的旋转操作。

    • 示例:

    1  4  7      7  4  1
    2  5  8  ->  8  5  2
    3  6  9      9  6  3

最终结果是顺时针旋转 90 度 的矩阵。

这样就完成了 原地旋转,无需额外空间,时间复杂度 O(n²),空间复杂度 O(1)

注意在这份代码中,我们可以看到交换数组对应元素这段

 // 交换数组的左右对称元素
        while(i < j){
            int temp = arr[i]; // 暂存左侧元素
            arr[i++] = arr[j]; // 右侧元素赋值给左侧,同时左指针右移
            arr[j--] = temp; // 左侧元素赋值给右侧,同时右指针左移
        }

是之前一道题目复用的,用两个指针实现元素的交换,代码很简洁,链接见这里:189. 轮转数组

问题与解答

[NOTE] 问题1:

//沿对角线反转二维矩阵
      for(int i = 0; i < n; i++){
           for(int j = i; j < n; j++){
              int temp = matrix[i][j];
              matrix[i][j] = matrix[j][i];
              matrix[j][i] = temp;
         }
       }

这里的int j = i;为什么这样写?因为要翻转右上方的对角吗?
解答:
是的,int j = i; 的目的是只遍历右上三角区域,从而沿主对角线(左上到右下)进行翻转,避免重复交换。
详细解析

  1. 主对角线的概念
  • 以主对角线(matrix[i][i],即 (0,0) → (1,1) → (2,2) → …)为对称轴。

  • 交换 对角线两侧的元素,即 matrix[i][j]matrix[j][i]

  1. 为什么 j = i

    • j = i 确保只交换主对角线右上部分的元素,避免重复交换。

    • 如果 j0 开始,会导致元素被交换两次,最终不变

相关文章:

  • python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测
  • vue数据重置
  • RFID测温技术:提升电缆安全监测的理想选择
  • docker pull时报错:https://registry-1.docker.io/v2/
  • 开源链动2+1模式与AI智能名片赋能的S2B2C共享经济新生态
  • 批量配置Linux ~/.bash_profile
  • 医学图像分割数据集肺分割数据labelme格式6299张2类别
  • 数据库基础知识点(系列二)
  • Atlas 800I A2 双机直连部署DeepSeek-R1-w8a8
  • SAP Activate Methodology in a Nutshell Phases of SAP Activate Methodology
  • 位运算题目:最大单词长度乘积
  • Netty源码—客户端接入流程
  • Linux应用:select、poll
  • 算法每日一练 (18)
  • 23种设计模式-创建型模式-原型
  • 4、操作系统结构和发展史
  • 深入理解8086指令集与反汇编技术
  • Pythonload JSON文件需要手动关闭吗?
  • 钞票准备好了吗?鸿蒙电脑 5 月见
  • linux去掉绝对路径前面部分和最后的/符号
  • “乐购浦东”消费券明起发放,多个商家同期推出折扣促销活动
  • 五一假期上海推出首批16条“市民健康路线”,这些健康提示请收好
  • 俄宣布停火三天,外交部:希望各方继续通过对话谈判解决危机
  • 伊朗港口爆炸死亡人数升至70人
  • 药明康德一季度净利增长89%,在手订单增超四成至523亿元
  • 龚正会见委内瑞拉副总统罗德里格斯