Leetcode-48-旋转图像

news2024/12/23 4:27:12

题目说明

给定一个 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]
]

分析

旋转图像,这个应用在图片处理的过程中,非常常见。我们知道对于计算机而言,图像,其实就是一组像素点的集合(所谓点阵),所以图像旋转的问题,本质上就是一个二维数组的旋转问题。

方法一:数学方法(转置再翻转)

我们可以利用矩阵的特性。所谓顺时针旋转,其实就是先转置矩阵,然后翻转每一行。

代码如下:

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[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = 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;
        }
    }
}

复杂度分析
时间复杂度:O(N^2)
这个简单的方法已经能达到最优的时间复杂度O(N^2) ,因为既然是旋转,那么每个点都应该遍历到,N^2的复杂度不可避免。
空间复杂度:O(1)。旋转操作是原地完成的,只耗费常数空间

方法二:分治(分为四部分旋转)

方法 1 使用了两次矩阵操作,能不能只使用一次操作的方法完成旋转呢?
为了实现这一点,我们来研究每个元素在旋转的过程中如何移动。
在这里插入图片描述

这提供给我们了一个思路,可以将给定的矩阵分成四个矩形并且将原问题划归为旋转这些矩形的问题。这其实就是分治的思想。
在这里插入图片描述
具体解法也很直接,可以在每一个矩形中遍历元素,并且在长度为 4 的临时列表中移动它们。

代码如下:

public void rotate(int[][] matrix) {
	int n = matrix.length;
	
	for (int i = 0; i < n / 2 + n % 2; i++) {
		for (int j = 0; j < n / 2; j++) {
			int[] tmp = new int[4];
			int row = i;
			int col = j;
			for (int k = 0; k < 4; k++) {
				tmp[k] = matrix[row][col];
				// 定位下一个数
				int x = row;
				row = col;
				col = n - 1 - x;
			}
		
			for (int k = 0; k < 4; k++) {
				matrix[row][col] = tmp[(k + 3) % 4];
				int x = row;
				row = col;
				col = n - 1 - x;
			}
		}
	}
}

复杂度分析
时间复杂度:O(N^2) 是两重循环的复杂度。
空间复杂度:O(1) 由于我们在一次循环中的操作是“就地”完成的,并且我们只用了长度为 4 的临时列表做辅助。

方法三:分治法改进(单次循环内完成旋转)

大家可能也发现了,我们其实没有必要分成4个矩阵来旋转。这四个矩阵的对应关系,其实是一目了然的,我们完全可以在一次循环内,把所有元素都旋转到位。
因为旋转的时候,是上下、左右分别对称的,所以我们遍历元素的时候,只要遍历一半行、一半列就可以了(1/4元素)。
展示代码如下

public void rotate(int[][] matrix) {
	int n = matrix.length;
	// 不区分子矩阵,直接遍历每一个元素
	for( int i = 0; i < (n + 1)/2; i++ ){
		for( int j = 0; j < n/2; j++ ){
		int temp = matrix[i][j];  //2,2
		matrix[i][j] = matrix[n-j-1][i];
		matrix[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;
		}
	}
}

复杂度分析
时间复杂度:O(N^2),是两重循环的复杂度。
空间复杂度:O(1)。我们在一次循环中的操作是“就地”完成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

Day 14 Classfication (short version) 二分类的时候 用sigmoid 那不就是 logistic 回归嘛&#xff08;softmax 的二分类等价&#xff09; Loss 哦 今天刚学的 &#xff0c;KL散度 &#xff0c;看来cross-entropy 和KL散度是等价的咯~ 我感觉我的直觉没错 这里MSE离得很远的时候…

五、书架开发--5.书架分组功能开发

Dialog和ShelfGroupDialog的基本实现思路&#xff1a; 加入两个组件&#xff0c;一个是Dialog移出分组的弹窗&#xff0c;一个是ShelfGroupDialog&#xff0c;一个是create-api中加入这个ShelfGroupDialog 接下来我们看看这个移动书籍这个对话框的实现原理 如下&#xff0c;用…

Python 标准库functools高阶函数用法

目录 1. partial 用法示例 2. reduce 用法示例 3. total_ordering 用法示例 4. cmp_to_key 用法示例 5. lru_cache 用法示例 6. singledispatch 用法示例 7. update_wrapper 用法示例 8. partialmethod 用法示例 9. singledispatchmethod 用法示例 10. cache 用法示例…

HoloLens2开发时,VS2022的组件和模块配置

HoloLens2开发的时候&#xff0c;VS2022的安装和配置清单&#xff08;有的模块可能不是必须的模块&#xff09; 一、大的模块配置 二、各模块组件的配置

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例——日期类的…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓apk文件签名

一、环境准备 链接: https://pan.baidu.com/s/1D3WxIL5M5ewyFNTqJzARPw 提取码: pd6w 上篇博文编译的apk文件 1、docker build -t android-build:v1.0.1 . 直接制作镜像 2、docker run -it android-build:v1.0.1 /bin/bash 运行进入容器 指定sdk的路径&#xff0c;然后直接…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

RESA 车道线检测模型-debug分析

车道线检测模型 RESA 该模型只有一个关键点就是resa模块&#xff0c;把这个想清楚就没什么了&#xff0c;下面看代码 class RESA(nn.Module):def __init__(self, cfg):super(RESA, self).__init__()# self.iter cfg.resa.iter# chan cfg.resa.input_channel# fea_stride c…

绝地求生:PUBG七周年:杜卡迪联动即将到来!

4.13号PUBG官博放出来一个图片让大家猜测是什么东西。 结合之前绝地求生的官方的公告&#xff0c;该载具皮肤毫无疑问就是著名摩托车品牌&#xff1a;杜卡迪。 这篇文章就来简单分析一下本次即将到来的摩托车联动的具体细节。 品牌介绍 杜卡迪&#xff08;Ducati Motor &…

【测试开发学习历程】python常用的模块(中)

目录 5 time模块 5.1、Python中的四种格式的时间&#xff1a; 5.2、time模块中的常用函数 6 I/O流操作 6.1 创建文件 6.2 读取一个文件存入到另外一个文件 6.3 with open as 结构 6.4 open和with open as的区别 7 Excel的操作模块-openpyxl 7.1、新建Excel文件进行读…

PTA 编程题(C语言)-- 判断素数

题目标题&#xff1a; 判断素数 题目作者 陈越 浙江大学 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于…

渗透测试实战——第一站

仅供交流学习使用&#xff0c;请勿用于非法用途 前言&#xff1a;刚学了sql注入&#xff0c;只听理论总感觉没啥用&#xff0c;今天花了一半个多小时&#xff0c;去尝试寻找有漏洞的网站&#xff0c;最终找到了一个&#xff1b;实践是检验真理的唯一标准。 我是通过黑客常用语法…

网络基础先导

前言&#xff1a;最好在牢固前面几大件&#xff08;编程语言、数据结构、操作系统&#xff09;&#xff0c;并且您有一个服务器的基础上&#xff08;我使用的是腾讯云中配置最低的服务器&#xff09;再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…

绝地求生:PWS韩国联赛结束:KDF夺冠,DNW三年来首次错失世界赛

4.14号PWS韩国联赛结束了为期3天的决赛&#xff0c;KDF战队以73击杀117分获PWS第一阶段冠军&#xff0c;队内Heaven获MVP&#xff0c;DK_seoul伤害王。 常规赛靠前的DNW和Gen.G决赛均发挥失常都没有进入前八&#xff0c;其中上届世界冠军DNW在双S核心出走后时隔三年首次错失世界…

OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析

摘要&#xff1a;本文简单介绍如何编写第一个hello world程序&#xff0c;以及程序是被执行的 适合群体&#xff1a;适用于Hi3861开发板&#xff0c;启动流程分析 4.1编写第一个程序 编写一个hello world程序比较简单&#xff0c;可以参考官网&#xff1a; https://gitee.c…

【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

粤嵌—2024/3/21—Pow(x,n)

代码实现&#xff1a; 方法一&#xff1a;常规解法——超时 double myPow(double x, int n) {if (n 0) {return 1.0;}if (x 1.0) {return x;}double num x;if (n > 0) {for (int i 1; i < n; i) {num num * x;}} else {n -n;for (int i 1; i < n; i) {num num…