Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >旋转图像

旋转图像

作者头像
木瓜煲鸡脚
发布于 2021-01-18 07:21:21
发布于 2021-01-18 07:21:21
1.4K00
代码可运行
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记
运行总次数:0
代码可运行

01

题目描述

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

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

示例1:

给定 matrix = [ [ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9] ], 原地旋转输入矩阵,使其变为: [ [ 7, 4, 1], [ 8, 5, 2], [ 9, 6, 3] ]

示例2:

给定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋转输入矩阵,使其变为: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ]

02

四指针

这一题与前面写到的旋转数组一题相似,之前是一维的,现在相当于是二维版。同样是两种思路一种是直接设置值到最终的地方,被覆盖的值先用备份变量拿出来再往它的目的地去设。第二种就是反转的思路。

旋转上图过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1) 
backup = m[0][1] m[0][1] = m[0][0] 
(2) 
temp = backup backup = m[1][1] m[1][1] = temp 
(3) 
temp = backup backup = m[1][0] m[1][0] = temp 
(4) 
m[0][0] = backup

由于是2×2所以一次旋转设值完事,如果是3×3

和之前那一题还是有点差别,这边设置值的传递固定是四个完成一组,然后需要判断一圈有多少组

四次设置值是一个单元操作,之后指针变动第一个指针是水平向右移动,第二个指针是垂直向下其他依次,直到头length-1。那么外循环条件是有几圈2×2,3×3都只有一圈,4×4与5×5是两圈。也就是length/2圈,内循环为每圈要移动多少组数字它取决于终点索引,并且每往内一圈length都会少2两边都会靠近1格。

  • 外圈(第一圈)起点matrix[0][0] 终点matrix[0][2] 有三组
  • 内圈(第二圈)起点matrix[1][1] 终点matrix[1][1] 只有一组

也就是当外循环完毕内循环的起点是和外循环相同,也就是j = i然后j在往后递增直到终点,终点会往内圈慢慢递减

我们这里只看首指针的变化,其他一样推总结在代码里

  • 第一圈从[0][0]--->[0][4] 5组
  • 第二圈从[1][1]--->[1][3] 3组
  • 第三圈就[2][2] 1组
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void rotate(int[][] matrix) {
  int n = matrix.length;
  int s = n;
  for (int i = 0; i < n/2; i++,s--) {
    for (int j = i; j < s-1; j++) {
      int backup = matrix[j][n-i-1];
      matrix[j][n-i-1] = matrix[i][j];
            
      int temp = matrix[n-i-1][n-j-1];
      matrix[n-i-1][n-j-1] = backup;
      backup = temp;
            
      temp = matrix[n-j-1][i];
      matrix[n-j-1][i] = backup;
      backup = temp;
            
      matrix[i][j] = backup;
    }
  }
}

总体实现了这样一个主线,但就是我们去存将被覆盖的值其实不需要另外添加一个变量backup我们可以直接把它存在首指针的地方,那个地方到最后才被设值中途是啥都没有关系我们就暂时用它存(空间已经存在了不用白不用)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void rotate(int[][] matrix) {
  int n = matrix.length;
  int s = n;
  for (int i = 0; i < n/2; i++,s--) {
    for (int j = i; j < s-1; j++) {
      int temp = matrix[i][j]
      matrix[i][j] = matrix[j][n-i-1];
      matrix[j][n-i-1] = temp;
            
      temp = matrix[n-i-1][n-j-1];
      matrix[n-i-1][n-j-1] = matrix[i][j];
      matrix[i][j] = temp;
            
      temp = matrix[n-j-1][i];
      matrix[n-j-1][i] = matrix[i][j];
      matrix[i][j] = temp;
 
    }
  }
}

03

两次反转

第二种方式就反转和旋转数组一题一样我们直接观察输入图与目标图通过怎样的变换可以得到

旋转90度的关系肯定是没有直接方式的,这里我们肯定是用到的设值。通过图形变换反转类似的方式就两数交换完成就可能进行几组反转比起上面直接的一步的到位的设值方式在单元操作上两数交换比起四数看起来简一点。但有进行多组遍历的可能。它是转90而不是180如果是180就上下反转然后左右反转。所以这里只能对角反转加左右反转先后无所谓

无论怎么转都可以实现总之是通过两个数的交换就很简单,然后要进行两次。下面代码按照第一条进行,第一个变换只需要遍历左上一半即可每个完成和下面的交换即可因此列的起点是递增的j = i,第二个变换循环时列只需要左边一半就换行所以j = length/2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void rotate(int[][] matrix) {
  int n = matrix.length; 
  for(int i = 0; i < n; i++) {
    for (int j = i; j < n; j++) { 
      int tmp = matrix[j][i]; 
      matrix[j][i] = matrix[i][j]; 
      matrix[i][j] = tmp; 
    } 
  } 
  for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n / 2; j++) {
      int tmp = matrix[i][j]; 
      matrix[i][j] = matrix[i][n - j - 1]; 
      matrix[i][n - j - 1] = tmp; 
    } 
  } 
}

04

总结

总体来说都是一个原地算法,时间也都是O(n^2),像这一题与之前一题都是属于数组内原地的变化位置即多值交换以及换成多组反转即两值交换的组合。这些题主要也是体会在数组这样的数据结构当中我们可以有的算法思想:遍历、逆序、原地交换、快慢指针。万变不离其中,那么从更新《LeetCode日常》系列开始到这篇为止LeetCode初级算法合集中的数组篇章完结即将开启下一篇章字符串相关算法

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【LeetCode程序员面试金典】面试题 01.07. Rotate Matrix LCCI
Given an image represented by an N x N matrix, where each pixel in the image is 4 bytes, write a met
韩旭051
2020/06/22
4460
力扣73——矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
健程之道
2019/12/31
3290
【一天一大 lee】旋转图像 (难度:中等) - Day20201219
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
前端小书童
2021/01/05
3560
二维数组的花式遍历技巧盘点
有不少读者说,看过很多公众号历史文章之后掌握了框架思维,可以解决大部分有套路框架可循的题目。
labuladong
2021/12/13
1.1K0
二维数组的花式遍历技巧盘点
☆打卡算法☆LeetCode 48、旋转图像 算法解析
链接:48. 旋转图像 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
3360
☆打卡算法☆LeetCode 48、旋转图像  算法解析
旋转数组
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的 原地 算法。
木瓜煲鸡脚
2020/09/23
4320
旋转数组
前几天挂掉一个读者的滴滴二面矩阵题目
今天是小浩算法 “365刷题计划” 第103天。这是前几天一个同学去滴滴面试的原题。
程序员小浩
2020/06/02
4690
leetcode-48-旋转图像
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
chenjx85
2018/08/16
5540
Leetcode No.48 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
week
2021/11/29
1860
Leetcode No.48 旋转图像
一起刷 leetcode 之旋转矩阵
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
每天晒白牙
2020/08/20
7300
leecode刷题(10)-- 旋转图像
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
希希里之海
2019/02/15
3900
数据结构(5):数组
数组是由 n(n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在 n 个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
不可言诉的深渊
2021/04/16
9980
LeetCode 图解 | 48 . 旋转图像
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
五分钟学算法
2020/04/22
4980
数组还可以这样用!常用但不为人知的应用场景
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/01/23
3590
数组还可以这样用!常用但不为人知的应用场景
C语言——oj刷题——字符串左旋和轮转数组
实现: 当我们谈到字符串左旋时,我们指的是将字符串中的字符向左移动一定数量的位置。这个问题在编程中非常常见,特别是在字符串处理和算法实现中。
GG Bond1
2024/06/14
820
C语言——oj刷题——字符串左旋和轮转数组
LeetCode通关:数组十七连,真是不简单
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
三分恶
2021/08/10
3960
算法刷题:LC初级算法(二)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
看、未来
2021/09/18
3050
LeetCode54. 螺旋矩阵&LeetCode59.螺旋矩阵 II&LeetCode48. 旋转图像
 要是去找每次移动下标之间的关系就错了,很难找到,应该从宏观角度去看,首先打印的是最外层一圈,然后打印倒数第二层的一圈,...依次下去,所以应该这么做,找到最左上角的坐标(lx,ly)和最右下角的坐标(rx,ry),让lx加加直到lx==rx,然后让ly加加直到ly==ry,再让rx减减直到rx==lx,最后ry减减直到ry==ly,完了以后将lx,ly加加,rx,ry减减,这样就到了内一层,继续执行旋转,直到rx<lx或ry<ly就停止,注意特殊情况特判即可
mathor
2018/08/17
4830
LeetCode54. 螺旋矩阵&LeetCode59.螺旋矩阵 II&LeetCode48. 旋转图像
剑指Offer-1
---- 做了又忘,忘了又做,怎么刷都是学不会啊啊啊 1 从每行每列都是递增的二维数组中找是否存在某数 public class Solution { public boolean Find(int target, int[][] array) { int rows = array.length; int cols = array[0].length; int i = rows - 1; int
晚上没宵夜
2020/12/08
3310
用javascript分类刷leetcode24.其他类型题(图文视频讲解)1
73. 矩阵置零( medium)给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例 1:图片输入:matrix = [1,1,1,1,0,1,1,1,1]输出:[1,0,1,0,0,0,1,0,1]示例 2:图片输入:matrix = [0,1,2,0,3,4,5,2,1,3,1,5]输出:[0,0,0,0,0,4,5,0,0,3,1,0]提示:m == matrix.lengthn == matrix0.length1 <= m, n <
js2030code
2023/01/03
4680
相关推荐
【LeetCode程序员面试金典】面试题 01.07. Rotate Matrix LCCI
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档