LeetCode 算法: 旋转图像c++

news2024/11/26 22:17:23

原题链接🔗: 旋转图像
难度:中等⭐️⭐️

题目

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

题解

辅助数组法

  1. 题解:

要将一个 n × n 的二维矩阵(代表一个图像)顺时针旋转 90 度,你可以遵循以下解题思路:

  1. 理解问题:首先,理解顺时针旋转90度意味着什么。对于矩阵中的每个元素,它将移动到原始位置的左上角方向。

  2. 创建新矩阵:由于旋转后的矩阵大小不会改变,你可以使用与原始矩阵相同大小的新矩阵来存储结果。

  3. 遍历原始矩阵:遍历原始矩阵的每个元素,确定它们在新矩阵中的位置。对于矩阵中的每个元素 matrix[i][j],它将在新矩阵中的位置是 new_matrix[j][n-1-i]。

  4. 填充新矩阵:按照上述规则,将原始矩阵的元素复制到新矩阵的相应位置。

  5. 优化空间:如果不需要保留原始矩阵,你可以在原地修改矩阵以节省空间。这可以通过先交换行,然后反转每一行来实现。

  6. 代码实现:根据上述逻辑,编写代码实现矩阵的旋转。

  7. 测试:编写测试用例来验证你的解决方案是否正确。确保测试包括各种大小的矩阵,包括特殊情况,如 n=1 或 n=2。

  8. 考虑边界条件:确保你的解决方案能够处理矩阵的边界条件,例如矩阵的第一行和第一列。

  9. 性能分析:分析你的解决方案的时间和空间复杂度。理想情况下,时间复杂度应该是 O(n^2),因为每个元素都被访问一次,空间复杂度应该是 O(1),如果原地旋转的话。

  10. 代码优化:如果可能,尝试优化你的代码,使其更简洁或提高性能。

以下是一个简化的步骤描述,展示了如何在原地旋转矩阵:

  • 交换矩阵的行和列,即 matrix[i][j] 与 matrix[j][n-1-i] 交换。
  • 反转每一行,即 matrix[i] 变为 matrix[i] 的逆序。

这种方法不需要额外的空间,因为它直接在原始矩阵上进行操作。但请注意,这种方法会修改原始矩阵,如果需要保留原始矩阵,则需要先复制一份。

  1. 复杂度:时间复杂度应该是 O(n2),时间复杂度应该是 O(n2)。
  2. 过程
  • 创建一个新的 n × n 的矩阵,用于存储旋转后的图像。
  • 遍历原始矩阵,对于每个元素matrix[i][j],将其复制到新矩阵的相应位置,使用公式 new_matrix[j][n-1-i]。
  • 释放原始矩阵(如果需要的话)。
  1. c++ demo
#include <iostream>
#include <vector>

using namespace std;

void rotateMatrix(vector<vector<int>>& matrix) {
    int n = matrix.size();
    vector<vector<int>> newMatrix(n, vector<int>(n));

    // 将原始矩阵的元素复制到新矩阵中
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            newMatrix[j][n - 1 - i] = matrix[i][j];
        }
    }

    // 将新矩阵赋值回原始矩阵
    matrix = newMatrix;
}

void printMatrix(const vector<vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    cout << "Original Matrix:" << endl;
    printMatrix(matrix);

    rotateMatrix(matrix);

    cout << "Rotated Matrix:" << endl;
    printMatrix(matrix);

    cout << endl;
    vector<vector<int>> matrix2 = {
    {5,  1,  9,  11},
    {2,  4,  8,  10},
    {13, 3,  6,  7 },
    {15, 14, 12, 16}
    };
    cout << "Original Matrix2:" << endl;
    printMatrix(matrix2);

    rotateMatrix(matrix2);

    cout << "Rotated Matrix2:" << endl;
    printMatrix(matrix2);



    return 0;
}
  • 输出结果:

Original Matrix:
1 2 3
4 5 6
7 8 9
Rotated Matrix:
7 4 1
8 5 2
9 6 3

Original Matrix2:
5 1 9 11
2 4 8 10
13 3 6 7
15 14 12 16
Rotated Matrix2:
15 13 2 5
14 3 4 1
12 6 8 9
16 7 10 11
在这里插入图片描述

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

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

相关文章

Kali之metasploit学习

目标&#xff1a;尝试使用metasploit制作一个windows 后门&#xff08;exe文件&#xff09; 一&#xff1a;使用metasploit生成一个exe安装包。 二、将对应的可执行文件放入到目标机 python3 -m http.server 端口号&#xff1a; 模块化启动一个端口。 windows 证书管理工具&…

Codeforces Global Round 26 D. “a“ String Problem 【Z函数】

D. “a” String Problem 题意 给定一个字符串 s s s&#xff0c;要求把 s s s 拆分成若干段&#xff0c;满足以下要求&#xff1a; 拆分出来的每一个子段&#xff0c;要么是子串 t t t&#xff0c;要么是字符 a a a子串 t t t 至少出现一次 t ≠ " a " t \ne…

机器学习分类及算法

1. 深度学习 1.1学习算法 1.2基本术语和概念 1.3机器学习分类常用算法 1.3.1线性回归 1.3.2逻辑回归 1.3.3决策树 1.3.4朴素贝叶斯 1.3.5支持向量机SVM 1.3.6K-最近临邻KNN 还有K-均值&#xff08;k-means&#xff09;、随机森林、降维、人工神经网络等 1.4超参数和验证集 1.4.…

【必会面试题】Java异常类型

目录 在Java中&#xff0c;异常和错误都继承自java.lang.Throwable类&#xff0c;这是Java异常处理机制的基础类。Throwable类有两个主要的子类&#xff1a;Exception&#xff08;异常&#xff09;和Error&#xff08;错误&#xff09;。 Error&#xff08;错误&#xff09;: …

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面&#xff0c;甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab…

vue-2 组件传值

组件关系分类 父子关系非父子关系 父子通信流程 父组件通过props将数据传递给子组件 给子组件以添加属性的方式传值子组件内部通过 props 接收模板中直接使用 props 接收的值 父组件 Parent.vue <template><div class"parent" style"border: 3px s…

全网首发-Docker被封后的代理设置教程

最近上交、科大以及阿里的一些docker镜像&#xff0c;好像都因为不可控力导致无法访问。 所以&#xff0c;之前好多正常的一些镜像的打包都会报错&#xff1a; 比如&#xff1a; #1 [internall load build definition from Dockerfile#1transferring dockerfile:972B done#1 D…

Day 13:3072. 将元素分配到两个数组中 Ⅱ

Leetcode 3072. 将元素分配到两个数组中 Ⅱ 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中** 严格大于** val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到…

一种基于混合协作的约束多目标优化的新型多群体进化算法

A novel multi-population evolutionary algorithm based on hybrid collaboration for constrained multi-objective optimization 原文链接: https://doi.org/10.1016/j.swevo.2024.101581 Wang Q, Li Y, Hou Z, et al. A novel multi-population evolutionary algorithm bas…

网络编程(一)基本概念、TCP协议

文章目录 一、概念&#xff08;一&#xff09;网络发展阶段1. ARPAnet阶段2. TCP/IP两个协议阶段3. 网络体系结构和OSI开放系统互联模型4. TCP/IP协议簇体系结构&#xff08;1&#xff09; 应用层&#xff1a;&#xff08;2&#xff09;传输层&#xff1a;&#xff08;3&#x…

集成算法实验(Bagging策略)

Bagging模型(随机森林) Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) 全称&#xff1a; bootstrap aggregation&#xff08;说白了就是并行训练一堆分类器&#xff09; 最典型的代表就是随…

聚鼎科技:装饰画哪里好卖

在当代社会&#xff0c;艺术与商业的界限日益模糊&#xff0c;装饰画作为一种既能美化空间又能体现个人品味的物品&#xff0c;受到了广泛的欢迎。但许多创作者和商家常常面临一个问题&#xff1a;《装饰画哪里好卖》? 要解决这个问题&#xff0c;我们需明白市场需求的重要性。…

斜率优化详解

斜率优化 [HNOI2008] 玩具装箱 状态转移方程&#xff1a; f i m i n ( f i , f j ( s u m i i − s u m j − j − L ) 2 ) i > j f_imin(f_i,f_j(sum_ii-sum_j-j-L)^2){i>j} fi​min(fi​,fj​(sumi​i−sumj​−j−L)2)i>j 设A为 s u m i i sum_ii sumi​i&…

代码随想录算法训练营第36天(py)| 贪心 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

452. 用最少数量的箭引爆气球 力扣链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同…

【kubernetes】k8s集群安全机制 保姆级攻略

目录 一、认证&#xff08;Authentication&#xff09; Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 A…

CCNA 0基础入门

OSI & TCP/IP OSI参考模型 TCP/IP协议 应用层 ------↓表示层 ------>应用层会话层 ------↑传输层 ------>传输层网络层 ------>网络互联层链路层 ------>网络接口层物理层 ------>↑ 物理层 传输的信号以及网线以及接线 主要作用是产生并检测电…

怎么修改Visual Studio Code中现在github账号

git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin

手部出现这4种症状,可能是糖尿病先兆!务必及时监测血糖

糖尿病来袭&#xff0c;手部或先知&#xff01;出现这 4 种症状&#xff0c;务必尽快监测血糖 第一&#xff0c;手指麻木感明显&#xff0c;当持续性的高血糖损害手部血管与神经末梢时&#xff0c;便会导致手指产生麻木以及刺痛之感。而且随着血糖不断升高&#xff0c;受损的血…

【QT Creator软件】解决中文乱码问题

QT Creator软件解决中文乱码问题 问题描述&#xff1a;Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8&#xff0c;但是仍然没有任何作用&#xff0c;于是有了以下的解决方案 原因剖析&#xff1a;因为项目的编码与控制台的编码不一致…