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

ops/2025/3/26 1:12:22/

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

给定一个 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  74  5  6  ->  2  5  87  8  9      3  6  9
  1. 水平翻转每一行

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

    • 示例:

    1  4  7      7  4  12  5  8  ->  8  5  23  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.ppmy.cn/ops/169800.html

相关文章

“张江引擎 人形启程”,AI 机器人开启上海进化新范式

当AI从虚拟算法跃入物理世界&#xff0c;机器人正以技术攻关、产品迭代、场景落地为着力点&#xff0c;为上海塑造现代化产业体系提供重要支撑。 在张江机器人谷这片创新热土上&#xff0c;青龙机械臂在产线精准起舞&#xff0c;开普勒物流机器人走出仓库化身“物流小哥”&…

Jupyter Notebook 常用命令(自用)

最近有点忘记了一些常见命令&#xff0c;这里就记录一下&#xff0c;懒得找了。 文章目录 一、文件操作命令1. %cd 工作目录2. %pwd 显示路径3. !ls 列出文件4. !cp 复制文件5. !mv 移动或重命名6. !rm 删除 二、代码调试1. %time 时间2. %timeit 平均时长3. %debug 调试4. %ru…

计算机网络 第一章:计算机网络和因特网(2)

1.4 分组交换网中的时延、丢包和吞吐量 1.4.1 分组交换网中的时延概述 分组从一台主机&#xff08;源&#xff09;出发&#xff0c;通过一系列路由器传输&#xff0c;在另一台主机&#xff08;目的地&#xff09;中结束它的历程。当分组从一个节点&#xff08;主机或路由器&…

提取关键 CSS: react 的项目中如何使用criticalCSS

在 React 项目中优化首屏加载性能时&#xff0c;Critical CSS&#xff08;关键 CSS&#xff09;是一项重要技术。以下是详细步骤和实现方法&#xff1a; 一、Critical CSS 的作用 首屏优化&#xff1a;提取渲染首屏内容所需的最小 CSS&#xff0c;内联到 HTML 中&#xff0c;减…

C++:背包问题习题

1. 货币系统 1371. 货币系统 - AcWing题库 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每种货币使用的次数不限。 不同种类的货币&#xff0c;面值可能是相同的。 现在&#xff0c;要你用这 V 种货币凑出 N 元钱&#xff0c;请问共有多少种不同的…

Python----计算机视觉处理(Opencv:绘制图像轮廓:寻找轮廓,findContours()函数)

一、轮廓 轮廓是图像中目标物体或区域的外部边界线或边界区域&#xff0c;由一系列相连的像素构成封闭形状&#xff0c;代表了物体的基本外形。与边缘不同&#xff0c;轮廓是连续的&#xff0c;而边缘则不一定是连续的。 轮廓与边缘的区别&#xff1a; 轮廓是一组连续的点或线…

Android Compose 基础布局之 Box 和 Stack 源码深度剖析(九)

Android Compose 基础布局之 Box 和 Stack 源码深度剖析 一、引言 1.1 Android 开发中布局的重要性 在 Android 应用开发里&#xff0c;布局是构建用户界面&#xff08;UI&#xff09;的关键环节。良好的布局设计能够提升用户体验&#xff0c;使应用界面更加美观、易用且具有…

蓝桥备赛(24)算法篇【前缀和】

一、前缀和 前缀和与差分的核心思想是 预处理 &#xff0c; 可以再暴力枚举的过程中 &#xff0c; 快速给出查询结果 &#xff0c; 从而优化时间复杂度。 是经典的用空间替换时间的做法 。 二、 一维前缀和 登录—专业IT笔试面试备考平台_牛客网 注意&#xff1a; 使用前缀和…