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

力扣经典算法篇-41-旋转图像(辅助数组法,原地旋转法)

1、题干

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 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]]

提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

2、解题

旋转数组,我们根据示例可以发现:原本的第一行数据旋转变成了最后一列;第二行的数据变成了倒数第二列;依次类推。
结合具体的数组找规律可以发现:
假设n=4,规律:3,0–>0,0 2,0–>0,1 1,0–>0,2 0,0–>0,3
从索引的角度可以发现:前元素的行=新元素的列; 新元素的列+前元素的行=n-1

方法一:(辅助数组法)

使用辅助数组,保持和原数组相同的数据。可以借助辅助数组对原始数组快速赋值。
规律:
旋转后元素的行为之前的列;旋转后元素的列+之前的行=n-1

技巧:
需要结合当n=3和n=4的简单场景下,自己找规律,不能懒。

代码示例:

import java.util.Arrays;public class Test47 {// 使用辅助数组public static void rotate(int[][] matrix) {int n = matrix.length;int[][] matrixN = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {matrixN[i][j] = matrix[i][j];  // 辅助数组保持相同的数据}}// 假设=4,规律:3,0-0,0  2,0-0,1  1,0-0,2  0,0-0,3// 前元素的行=新元素的列;  新元素的列+前元素的行=n-1for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {matrix[i][j] = matrixN[n-j-1][i];    // 旋转后元素的行为之前的列;旋转后元素的列+之前的行=n-1}}}public static void main(String[] args) {int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};rotate(matrix);System.out.println(Arrays.deepToString(matrix));}
}

方法二:(原地旋转法)

相对辅助数组法,原地选择法进需要一次遍历原始数据,且辅助空间为O(1),性能更好,但是相对难度也高一点。

注意点:
(1)、一次旋转的规律
结合简单数据可以看出。下标位置变化如:(0,0)–>(0,5)–>(5,5)–>(5,0)–>(0,0)
可以发现相邻的两个数之间的内部一定相等,外部相加一定=n-1。

(2)、旋转的次数
同一个元素会携带者对应的其他三个元素在一次过程中完成选择。所以不能完全遍历数据,会造成同一个元素多次旋转,最终回到原始数据。
如原始为一个55的二维数组,我们只需要对如下的23的区域进行旋转即可(或3*2的区域也一样)。如果旋转多了就会造成问题。
在这里插入图片描述

代码示例:

import java.util.Arrays;public class Test47 {public static void rotate(int[][] matrix) {int n = matrix.length;// 假设=4,规律:3,0-0,0  2,0-0,1  1,0-0,2  0,0-0,3// 前元素的行=新元素的列;  新元素的列+前元素的行=n-1for (int i = 0; i < (n + 1) / 2; i++) {    // 防止重复旋转(旋转一半,只能+1一次,横+1则纵不能+1)for (int j = 0; j < n / 2; j++) {      // 防止重复旋转int temp = matrix[i][j];matrix[i][j] = matrix[n - j - 1][i];     // 规律:外部相等,内部相加=n-1matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];matrix[j][n - i - 1] = temp;}}}public static void main(String[] args) {int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};rotate(matrix);System.out.println(Arrays.deepToString(matrix));}
}

向阳前行,Dare To Be!!!

http://www.xdnf.cn/news/16977.html

相关文章:

  • 基于深度学习的医学图像分析:使用变分自编码器(VAE)实现医学图像生成
  • 华为智能家居与Spring人工智能
  • PyTorch生成式人工智能(24)——使用PyTorch构建Transformer模型
  • 06.Redis 配置文件说明
  • C++ <type_traits> 应用详解
  • 需求和测试的映射关系
  • 推荐一款进程间高速交换数据的解决方案
  • 前端JS-调用单删接口来删除多个选中文件
  • 操作系统——读者写者问题
  • Spring **${}** vs **#{}** 语法全景图
  • 【C++ 初级工程师面试--5】inline内联函数特点 、和普通函数的区别、什么时候适合内联?
  • Shell脚本-变量如何定义
  • 什么是DOM和BOM?
  • 搜索引擎评估革命:用户行为模型如何颠覆传统指标?
  • 数据结构1-概要、单向链表
  • [网安工具] Web 漏洞扫描工具 —— AWVS · 使用手册
  • 【C语言】内存函数与数据在内存中的存储
  • python -m build打包成为tar.gz或者whl
  • Qemu-NUC980(二):时钟clock代码添加
  • Redis数据库存储键值对的底层原理
  • SpringBoot相关注解
  • #Linux内存管理#缺页中断处理的核心函数是do_page_fault()的工作原理
  • Vulnhub ELECTRICAL靶机复现(附提权)
  • RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物属性(三)
  • (LeetCode 面试经典 150 题) 138. 随机链表的复制 (哈希表)
  • Kotlin单例模式懒汉模式:LazyThreadSafetyMode.SYNCHRONIZED(2)
  • 深度学习(鱼书)day09--与学习相关的技巧(前三节)
  • P10816 [EC Final 2020] Namomo Subsequence|普及+
  • 机器学习实战:KNN算法全解析 - 从原理到创新应用
  • 【LeetCode 热题 100】(三)滑动窗口