- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在这个自拍时代,我们经常需要调整照片的方向。有时拍出来的照片歪了,需要旋转90度;有时想要换个角度看看效果,来回旋转照片。这种旋转操作不仅存在于我们的日常生活中,在计算机图形学、图像处理等领域也是一个基础且重要的操作.
LeetCode第48题"旋转图像"要求我们:给定一个 n × n 的二维矩阵 matrix 表示一个图像,将图像顺时针旋转 90 度。要求必须在原地旋转图像,也就是说,你需要直接修改输入的二维矩阵.
Ví dụ:
输入:matrix = [[1,2,3], [4,5,6], [7,8,9]] 输出:[[7,4,1], [8,5,2], [9,6,3]]
就像我们在手机相册里旋转照片一样,每个像素点都要移动到新的位置,但我们需要保证不使用额外的存储空间! 。
最简单的想法就像我们复印一张照片,在新的纸上重新排列像素。虽然这种方法使用了额外空间,不符合题目要求,但它帮助我们理解旋转的本质.
public void rotate(int[][] matrix) { int n = matrix.length; // 创建一个新的n×n数组 int[][] temp = new int[n][n]; // 将原矩阵旋转90度后的结果存入临时数组 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 关键转换:第i行第j列的元素,旋转后变成第j行第(n-1-i)列 temp[j][n-1-i] = matrix[i][j]; } } // 将结果复制回原矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { matrix[i][j] = temp[i][j]; } } }
仔细观察,我们发现90度旋转可以通过两步简单的操作完成:先沿对角线翻转,再沿竖直中线翻转。就像折纸一样,通过两次折叠就能达到旋转的效果! 。
想象你在玩魔方:
用3×3矩阵来说明:
原始矩阵: 对角线翻转: 竖直中线翻转: 1 2 3 1 4 7 7 4 1 4 5 6 → 2 5 8 → 8 5 2 7 8 9 3 6 9 9 6 3 第一步:对角线翻转 - (1,2)和(2,1)交换 - (1,3)和(3,1)交换 - (2,3)和(3,2)交换 第二步:竖直中线翻转 - 第1列和第3列交换 - 第2列保持不变
public void rotate(int[][] matrix) { int n = matrix.length; // 步骤1:沿主对角线翻转 for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { // 交换matrix[i][j]和matrix[j][i] int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } // 步骤2:沿竖直中线翻转 for (int i = 0; i < n; i++) { for (int j = 0; j < n/2; j++) { // 交换matrix[i][j]和matrix[i][n-1-j] int temp = matrix[i][j]; matrix[i][j] = matrix[i][n-1-j]; matrix[i][n-1-j] = temp; } } }
让我们比较这两种方法:
辅助数组法:
原地旋转法:
解决矩阵旋转问题的关键点:
相关的矩阵变换问题:
通过旋转图像这道题,我们学会了如何通过巧妙的数学变换来完成矩阵旋转。这种思维方式不仅能解决算法题,在图像处理、计算机图形学等领域都有广泛应用。记住,当遇到需要变换矩阵的问题时,可以考虑将复杂的变换分解为简单的操作组合,这样往往能得到更优雅的解决方案! 。
作者:忍者算法 公众号:忍者算法 。
我准备了一份刷题清单,以及这些题目的详细题解,覆盖了绝大部分常见面试题。我可以很负责任地说,只要你把这些题真正掌握了,80%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~ 。
最后此篇关于【忍者算法】从照片旋转到矩阵变换:探索图像旋转问题|LeetCode48旋转图像的文章就讲到这里了,如果你想了解更多关于【忍者算法】从照片旋转到矩阵变换:探索图像旋转问题|LeetCode48旋转图像的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我将 Ninject 与 ASP.NET MVC 4 一起使用。我正在使用存储库并希望进行构造函数注入(inject)以将存储库传递给其中一个 Controller 。 这是我的存储库界面: publ
在我们的 MVC 项目中,我们广泛使用 Ninject。由于未知原因,StandardKernel 开始抛出 NotSupportedException 并显示消息“不支持具有 null 或空名称的模
我正在逐字逐句地遵循 Yocto Project 2.4.2 快速入门指南,但当我尝试为 Intel MinnowBoard 构建时它失败了。我正在 Virtual Box 中的 Ubuntu 16.
我正在使用 VS 2017 的新“打开文件夹”功能,通过 CmakeSettings.json 自动构建 cmake。 代码是用C11写的,所以我需要用gcc(来自mingw-64)编译。我创建了一个
您可以将 Ninject 2.0 与 VS2010 RC1 一起使用吗? 最佳答案 我有类似的问题...尝试针对完整的 .NET 4 框架,而不是客户端配置文件。 据我了解 System.Web 在
我通过以下方式获得源代码(chrome) $ glient sync 运行所有命令请求: - gclient config ...... - GYP_GENERATORS ... -
在我们的作业中发现 here我们正在创建一款名为“牛仔、忍者、熊”的游戏,本质上是“石头、剪子、布”。所以我有两个问题。 1.) 如何将 c、n 或 b 分配给程序生成的随机数 1、2 或 3? 2.
我正在努力思考第 57 页上 Javascript ninja 中的一些代码。 function forEach(list, callback) { for (var n = 0; n < l
我刚刚从 NuGet 安装了新的 Ninject.MVC3 并试图让它在我的 asp.net mvc 3 应用程序中工作,但是我在浏览我的网站时不时收到这个奇怪的错误: [InvalidOperati
我想创建带有一点自定义辐条的饼图。 我想要实现的是在辐条上方显示名称 od 数据点,在辐条下方显示值。现在我知道如何用 func sChart(_ chart: ShinobiChart, label
尝试按照 ubuntu 16.04 x64 上的 android 文档从 aosp 构建 android,jdk 和工具链安装完成,但构建在几分钟后停止。这是构建日志: e@ubuntu:/e/aos
我一直在使用 Bob Cravens 博客中描述的存储库模式来创建我的应用程序,但我有点新,仍然在寻找解决方法。我想将我的 DataService 对象注入(inject)到我的 ViewModel
Tôi là một lập trình viên xuất sắc, rất giỏi!