算法leetcode|48. 旋转图像(rust重拳出击)

news2024/9/22 19:38:15

文章目录

  • 48. 旋转图像:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • c:
    • python:
    • java:


48. 旋转图像:

给定一个 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步,翻转的特点是两两交换,不会覆盖丢失原值。
  • 事实上还有一个很好的办法,矩阵,一个正方形,中心对称,可以均分为4份(边长为奇数时,中心点不需要移动,可以排除,其他点仍然可以4等分),然后遍历其中一份,将4份中对应位置的值做顺序交换。

题解:

rust:

  • 两次翻转:
impl Solution {
    pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
        let n = matrix.len();

        // 水平翻转
        (0..n / 2).for_each(|i| {
            (0..n).for_each(|j| {
                let temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][j] = temp;
            });
        });

        // 主对角线翻转
        (0..n).for_each(|i| {
            (0..i).for_each(|j| {
                let temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            });
        });
    }
}
  • 原地旋转:
impl Solution {
    pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
        let n = matrix.len();

        (0..n / 2).for_each(|i| {
            (0..(n + 1) / 2).for_each(|j| {
                let temp = matrix[i][j];
                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;
            });
        });
    }
}

go:

func rotate(matrix [][]int)  {
    n := len(matrix)

	// 水平翻转
	for i := 0; i < n/2; i++ {
		matrix[i], matrix[n-1-i] = matrix[n-1-i], matrix[i]
	}

	// 主对角线翻转
	for i := 0; i < n; i++ {
		for j := 0; j < i; j++ {
			matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
		}
	}
}

c++:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();

        // 水平翻转
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                swap(matrix[i][j], matrix[n - i - 1][j]);
            }
        }

        // 主对角线翻转
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
};

c:

void rotate(int** matrix, int matrixSize, int* matrixColSize){
    // 水平翻转
    for (int i = 0; i < matrixSize / 2; ++i) {
        for (int j = 0; j < matrixSize; ++j) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[matrixSize - i - 1][j];
            matrix[matrixSize - i - 1][j] = temp;
        }
    }

    // 主对角线翻转
    for (int i = 0; i < matrixSize; ++i) {
        for (int j = 0; j < i; ++j) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

python:

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """

        n = len(matrix)

        # 水平翻转
        for i in range(n // 2):
            for j in range(n):
                matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j]

        # 主对角线翻转
        for i in range(n):
            for j in range(i):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]


java:

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;

        // 水平翻转
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][j] = temp;
            }
        }
        
        // 主对角线翻转
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


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

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

相关文章

我国风电叶片行业分析:行业技术创新白热化竞争来临 后续回收再利用是行业可持续发展的关键

1、风电叶片行业定义及产业链 风电叶片是一个复合材料制成的薄壳结构&#xff0c;一般由外壳、腹板和主梁三部分组成&#xff0c;复合材料在整个风电叶片中的重量一般占到90%以上。风电叶片是风力发电机将风能转化为机械能的重要部件之一&#xff0c;其设计、制造及运行状态直…

易点易动设备管理系统帮助钢铁厂实现智能设备巡检

随着工业自动化和智能化的不断推进&#xff0c;越来越多的企业开始采用智能设备来提高生产效率和质量。然而&#xff0c;随之而来的是设备管理的复杂性和挑战性的增加。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生&#xff0c;该系统可以帮助钢铁厂实现智能设备…

从C出发 28 --- 指针与数组

int a[ ] {1, 2, 3, 4, 0}; //定义了一个数组&#xff0c;这个数组有5个元素&#xff0c;每个元素是一个 int 类型变量 这里的地址是相同的&#xff0c;是相同的意味着数组的地址和 0 号元素的地址是一样的 结论: 数值上相同但是意义上不同&#xff0c;一个是数组整体…

有仰拍相机和俯拍相机时,俯拍相机中心和吸嘴中心的标定

俯拍相机中心和吸嘴中心的标定 文章目录 俯拍相机中心和吸嘴中心的标定 前言适用模型如下&#xff1a;一、使用一个标定片进行标定1.关键注意&#xff1a;2.标定步骤&#xff1a; 二、使用一个L型的工件1.关键注意&#xff1a;2.标定步骤&#xff1a; 总结 前言 在自动化设备领…

centos7查看磁盘io

1.查看所使用到的命令为iostat&#xff0c;centos7没有自带iostat&#xff0c;需要安装一下 2.安装iostat命令 yum -y install sysstat 3.使用iostat命令 iostat %user&#xff1a;表示用户空间进程使用 CPU 时间的百分比 %nice&#xff1a;表示用户空间进程以降低优先级的…

索引失效了?看看这几个常见的原因

索引是 MySQL 数据库中优化查询性能的重要工具&#xff0c;通过对查询条件和表数据的索引&#xff0c;MySQL可以快速定位数据&#xff0c;提高查询效率。但是&#xff0c;在实际的数据库开发和维护中&#xff0c;我们经常会遇到一些情况&#xff0c;导致索引失效&#xff0c;从…

Vue安装

Vue安装 一、安装二、使用步骤1.在项目中使用vue2.使用命令创建vue项目 一、安装 安装vue之前需要安装nodeJS 1.需要安装Node.js。可以从官方网站进行下载并安装。 2.这篇博客有详细的步骤 Node.js安装详解 3.或者在官网安装最新版本的不用配置Node.js下载官网 安装完成Nod…

Python每日一练(20230424)

目录 1. 滑动窗口最大值 &#x1f31f;&#x1f31f;&#x1f31f; 2. 用栈实现队列 &#x1f31f; 3. 直线上最多的点数 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

准确率,精确率,召回率,F1,AUC

以西瓜数据集为例&#xff0c;我们来详细解释一下什么是TP、TN、FP以及FN。 一、基础概念 TP&#xff1a;被模型预测为正类的正样本 TN&#xff1a;被模型预测为负类的负样本 FP&#xff1a;被模型预测为正类的负样本 FN&#xff1a;被模型预测为负类的正样本 二、通俗理解&am…

如何在 Linux 中查找文件所有者?

在 Linux 系统中&#xff0c;每个文件和目录都有一个所有者&#xff08;owner&#xff09;和一个所属组&#xff08;group&#xff09;。所有者通常是创建该文件或目录的用户&#xff0c;而所属组通常是文件或目录所属的组。在某些情况下&#xff0c;您可能需要查找特定文件或目…

前端学习--Ajax(5) Http

一、Http简介 1.1 通信 信息的传递和交换 通信三要素&#xff1a;主体&#xff08;双方&#xff09;、内容、方式 1.2 通信协议 通信双方通信遵守的规则 http--超文本传输协议&#xff1a;客户端与服务器之间进行网页内容传输时必须遵守的传输格式 1.3 HTTP 交互模型&a…

C++矩阵运算QT应用之Eigen库

前言 本文主要描述在c中应用Eigen进行矩阵&#xff08;向量&#xff09;的表示运算&#xff0c;以及Eigen库的下载和配置。 一. Eigen库介绍、下载及配置 Eigen是C中可以用来调用并进行矩阵计算的一个库&#xff0c;里面封装了一些类&#xff0c;需要的头文件和功能如下&…

Vue:Ajax跨域和axios简单使用

1、 第三方库方式&#xff0c; 基于 Promise 的 HTTP 库&#xff1a;axios &#xff08;对 XMLHttpRequest进行的封装&#xff09; 即&#xff1a; axios.get().then() 2、跨域访问 定义&#xff1a;在 a 页面中想获取 b 页面中的资源&#xff0c;如果 a 页面和 b 页面…

DevOps 与研发效能专家张乐:研发效能的升维思考与降维执行

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上&#xff0c;DevOps 与研发效能资深技术专家张乐老师做了一场名为《研发效能的升维思考和降维执行》的主题演讲&#xff0c;阐述了如何系统化思考研发效能的关键要素、互动结构及实施路径&#xff0c;并将其与落地执…

程序员应该具备哪些良好的编程习惯?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 培养一个好的编程习惯&#xff0c;能让你整个职业生涯收益。 例如&#xff0c;做好注释&#xff0c;方便自己也方便别人读懂代码&#x…

hot100:数组——56、64

56. 合并区间 首先考虑只有两个区间的情况&#xff1a; 但是这6种情况可以合并成3种情况&#xff0c;就是上面的3种。首先先判断第一个区间的起始位置是否小于等于第二个区间的起始位置。如果不成立&#xff0c;则交换两个区间。 再考虑n个区间的情况&#xff0c;先将他们根…

QML中【预计符号】和【Unknown Component M300】的红色警告解决方法

问题描述&#xff1a; QML的项目中带中文&#xff0c;每次打开项目都在问题栏显示【预计符号】的红色警告&#xff0c;还有一种是【Unknown Component M300】的警告&#xff0c;代码能正常编译和运行。像我这样对代码追求优雅的强迫症患者看着很不爽&#xff0c;查了很多网上的…

深度强化学习——蒙特卡洛算法(6)

注&#xff1a;本章的内容作为补充插曲&#xff0c;大家可以选看&#xff0c;不过还是建议把最后一个使用蒙特卡洛近似求期望稍微看一下 蒙特卡洛是一大堆随机算法&#xff0c;通过随机样本来估算真实值 使用随机样本来近似Π 1、在[a,b]做随机均匀抽样&#xff0c;抽出n个样…

软件工程开发文档写作教程(02)—开发文档的分类

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 开发文档分类概述 软件项目实施过程中依据功能和作用的不同可以把文档分为以下几…

通过Python的filestools库给图片添加全图水印

文章目录 前言一、filestools库简介二、安装filestools三、查看filestools版本四、图片添加全图水印1.引入库2.添加水印3.效果 五、参数调整对比1.水印颜色1.1通过名称设置颜色1.2通过RGB值设置颜色1.3通过十六进制设置颜色 2.水印字体的大小3.水印的透明度4.水印直接的间隔5.水…