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

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 开始,会导致元素被交换两次,最终不变


http://www.kler.cn/a/599401.html

相关文章:

  • 分布式环境下的重复请求防护:非Redis锁替代方案全解析
  • 数据不外传!通过内网穿透实现绿联NAS远程访问的安全配置方案
  • iPaaS集成平台:企业数字化转型的加速器
  • VUE2导出el-table数据为excel并且按字段分多个sheet
  • 大模型技术在商品归一和商品预测中的应用
  • Shiro框架漏洞攻略
  • AI 时代,我们需要什么样的数据库?
  • 【全队项目】智能学术海报生成系统PosterGenius(项目介绍)
  • Resource usage
  • Linux系统还可以在做一层虚拟化安装虚拟机吗
  • Web3与网络安全:如何确保去中心化应用的安全性
  • 使用 ChatGPT 套结构仿写解决写作难题
  • Leetcode刷题笔记1 图论part03
  • 【操作系统安全】任务3:Linux 网络安全实战命令手册
  • 【C语言】多进程/多线程
  • python的文件上传
  • 4、操作系统结构和发展史
  • Ubuntu给appimage创建图标启动
  • Jira story与测试用例自动化关联脚本
  • [已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退