算法每日一练 (6)

server/2025/2/28 22:24:33/

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (6)
    • 旋转图像
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (6)

旋转图像

题目地址:旋转图像

题目描述

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

解题思路

  • 首先根据题意进行边界条件的判断,当 n * n 的二维矩阵中只有一个元素时,不需要任何处理,直接返回即刻。

  • 从旋转角度出发,观察现象,将一个矩阵分为四部分:

    • 顶部位置
    • 右侧位置
    • 底部位置
    • 左侧位置
  • 根据以上划分的四部分, n 阶矩阵旋转的逻辑就是:左侧位置 -> 顶部位置、底部位置 -> 左侧位置、右侧位置 -> 底部位置、顶部位置 -> 右侧位置

  • 再次观察矩阵的特点,将矩阵的旋转想象成每一圈的旋转,从外层圈再到内层圈的旋转。另外如果是奇数阶矩阵,最内层就不再需要旋转,因为只剩下一个元素。

  • 在每一圈中根据顶部位置坐标分别计算出:右侧位置、底部位置、左侧位置的坐标。

  • 接下来,坐标计算公式如下所示:

    • 顶部位置:
      i , j (由循环变量进行控制顶部元素) i,j(由循环变量进行控制顶部元素) ij(由循环变量进行控制顶部元素)

    • 右侧位置:
      x 1 = j ( 顶部元素的列值 ) y 1 = n − i − 1 ( 控制列数,其中 n 表示矩阵的阶数,随着行数的增加,目标列在减小 ) x1 = j (顶部元素的列值)\\ y1 = n - i - 1 (控制列数,其中n表示矩阵的阶数,随着行数的增加,目标列在减小) x1=j(顶部元素的列值)y1=ni1(控制列数,其中n表示矩阵的阶数,随着行数的增加,目标列在减小)

    • 底部位置:
      x 2 = y 1 ( 右侧元素的列值 ) x2 = y1(右侧元素的列值) x2=y1(右侧元素的列值)
      对于底部元素的列值需要分成三部分讨论:

      • 对角线位置
        y 2 = x 2 ( 当前元素位于对角线,那么行、列相等 ) y2 = x2(当前元素位于对角线,那么行、列相等) y2=x2(当前元素位于对角线,那么行、列相等)
      • 中值位置
        y 2 = x 1 ( 当是奇数阶矩阵并且位于中值位置时,列值就是对应顶部元素的列值 ) y2 = x1(当是奇数阶矩阵并且位于中值位置时,列值就是对应顶部元素的列值) y2=x1(当是奇数阶矩阵并且位于中值位置时,列值就是对应顶部元素的列值)
      • 其他位置
        y 2 = n − j + 1 ( 控制列数,其中 n 表示矩阵的阶数,随着列数的增大,目标列在减小 ) y2 = n - j + 1(控制列数,其中n表示矩阵的阶数,随着列数的增大,目标列在减小) y2=nj+1(控制列数,其中n表示矩阵的阶数,随着列数的增大,目标列在减小)
    • 左侧位置:

x 3 = y 2 ( 底部元素的列值 ) y 3 = i ( 顶部元素的行值 ) x3 = y2(底部元素的列值)\\ y3 = i(顶部元素的行值) x3=y2(底部元素的列值)y3=i(顶部元素的行值)

  • 另外,由于题目要求不能借助任何辅助容器,需要在原数组中进行处理,在迭代中只需要借助一个变量,保存 ”顶部位置“ 的值即可。

  • 最后根据上面移动的顺序,进行依次进行覆盖。

根据以上的解题思路,下面以 3 * 3 二维矩阵为例:

在这里插入图片描述

( 0 , 0 ) = > ( 0 , 2 ) = > ( 2 , 2 ) = > ( 2 , 0 ) ( 0 , 1 ) = > ( 1 , 2 ) = > ( 2 , 1 ) = > ( 1 , 0 ) (0,0)=>(0,2)=>(2,2)=>(2,0)\\ (0,1)=>(1,2)=>(2,1)=>(1,0) (0,0)=>(0,2)=>(22)=>(20)(0,1)=>(1,2)=>(21)=>(10)

下面再以 4 * 4 二维矩阵为例:

在这里插入图片描述

( 0 , 0 ) = > ( 0 , 3 ) = > ( 3 , 3 ) = > ( 3 , 0 ) ( 0 , 1 ) = > ( 1 , 3 ) = > ( 3 , 1 ) = > ( 1 , 0 ) ( 0 , 2 ) = > ( 2 , 3 ) = > ( 3 , 1 ) = > ( 1 , 0 ) ( 1 , 1 ) = > ( 1 , 2 ) = > ( 2 , 2 ) = > ( 2 , 1 ) (0,0)=>(0,3)=>(3,3)=>(3,0) \\ (0,1)=>(1,3)=>(3,1)=>(1,0) \\ (0,2)=>(2,3)=>(3,1)=>(1,0) \\ (1,1)=>(1,2)=>(2,2)=>(2,1) (0,0)=>(0,3)=>(3,3)=>(3,0)(0,1)=>(1,3)=>(3,1)=>(1,0)(0,2)=>(2,3)=>(3,1)=>(1,0)(1,1)=>(1,2)=>(2,2)=>(2,1)

解题代码

c/c++
#include <vector>class Solution
{
public:void rotate(std::vector<std::vector<int>> &matrix){int n = matrix.size();if (n == 1)return;int f = n & 1;int c = n >> 1;for (int i = 0; i < c; i++){for (int j = i; j < n - i - 1; j++){int top = matrix[i][j];// 右侧坐标int x1 = j;int y1 = n - i - 1;// 底部坐标int x2 = y1;int y2;if (i == j)y2 = x2;else if (f && j == c)y2 = j;elsey2 = n - j - 1;// 左侧坐标int x3 = y2;int y3 = i;// 左侧移动到顶部matrix[i][j] = matrix[x3][y3];// 底部移动到左侧matrix[x3][y3] = matrix[x2][y2];// 右侧移动到底部matrix[x2][y2] = matrix[x1][y1];// 顶部移动到右侧matrix[x1][y1] = top;}}}
};
golang
package mainfunc rotate(matrix [][]int) {n := len(matrix)if n == 1 {return}f := n & 1c := n >> 1for i := 0; i < c; i++ {for j := i; j < n-i-1; j++ {top := matrix[i][j]// 右侧坐标x1, y1 := j, n-i-1// 底部坐标x2 := y1var y2 intif i == j {y2 = x2} else if f != 0 && j == c {y2 = j} else {y2 = n - j - 1}// 左侧坐标x3, y3 := y2, i// 左侧移动到顶部matrix[i][j] = matrix[x3][y3]// 底部移动到左侧matrix[x3][y3] = matrix[x2][y2]// 右侧移动到底部matrix[x2][y2] = matrix[x1][y1]// 顶部移动到右侧matrix[x1][y1] = top}}
}
lua
local function rotate(matrix)local n = #matrixif n == 1 thenreturnendlocal f, c = n & 1, n >> 1for i = 1, c dofor j = i, (n - i) dolocal top = matrix[i][j]-- 右侧坐标local x1, y1 = j, n - i + 1-- 底部坐标local x2 = y1local y2if i == j theny2 = x2elseif f ~= 0 and j + 1 == c theny2 = jelsey2 = n - j + 1end-- 左侧坐标local x3, y3 = y2, i-- 左侧移动到顶部matrix[i][j] = matrix[x3][y3]-- 底部移动到左侧matrix[x3][y3] = matrix[x2][y2]-- 右侧移动到底部matrix[x2][y2] = matrix[x1][y1]-- 顶部移动到右侧matrix[x1][y1] = topendend
end

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述


http://www.ppmy.cn/server/171396.html

相关文章

Node.js项目启动流程以及各个模块执行顺序详解

Node.js项目启动流程以及各个模块执行顺序的问题。首先&#xff0c;我需要仔细阅读并理解我搜索到的资料&#xff0c;从中提取关键信息&#xff0c;然后综合这些信息组织成一个结构化的回答。 首先&#xff0c;根据我搜索到的资料都详细描述了Node.js的启动流程&#xff0c;涉及…

python实战项目59:使用python获取腾讯招聘数据并保存到mysql数据库中

python实战项目59:使用python获取腾讯招聘数据并保存到mysql数据库中 一、爬虫流程分析1、分析数据接口,发送请求二、创建数据库链接三、完整代码一、爬虫流程分析 1、分析数据接口,发送请求 目标网址为 https://careers.tencent.com/search.html?keyword=python&que…

典型相关分析:原理、检验与Matlab实战

内容摘要 本文系统讲解典型相关分析&#xff08;CCA&#xff09;的核心原理与Matlab实战应用&#xff0c;涵盖协方差矩阵分解、典型变量提取及假设检验全流程。通过职业满意度-基础设施、城市竞争力-基础设施两大案例&#xff0c;详解数据标准化、相关系数计算、典型载荷解析及…

以太坊客户端和以太坊网络

文章目录 以太坊客户端以太坊网络 以太坊客户端 以太坊客户端是实现以太坊规范并通过对等网络与其他客户端通信的软件应用程序。不同的以太坊客户端如果符合标准化通信协议&#xff0c;就可以互操作。尽管由不同团队和编程语言实现&#xff0c;它们都遵循相同的协议和规则。 …

MongoDB#Code和Function

背景 在MongoDB Shell中, 使用db.system.js.inertOne 新增一个自定义函数后&#xff0c;读取值类型显示Code Class&#xff0c;该如何使用&#xff1f;Code类型和Function能互相转换吗&#xff1f; 实践 // 保存一个函数到 system.js 集合 db.system.js.insertOne({_id: &qu…

矩阵碰一碰发视频源码搭建之,支持OEM

引言 阵碰一碰发视频" 技术凭借其便捷的交互方式和高效的传播能力&#xff0c;已成为品牌推广和内容创作的重要工具。为进一步提升视频传播效果&#xff0c;本文将深入探讨如何在矩阵碰一碰系统中集成 AI 文案生成功能&#xff0c;实现 "一碰即传 智能文案" 的…

flask后端开发(8):Flask连接MySQL数据库+ORM增删改查

目录 数据库初始化数据库连接创建数据库表添加用户查询用户更新用户删除 在Flask中&#xff0c;很少会使用pymysql直接写原生SQL语句去操作数据库&#xff0c;更多的是通过SQLAichemy提供的ORM技术&#xff0c;类似于操作普通Python对象一样实现数据库的增删改查操作&#xf…

网络安全体系

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络安全体系 目前计算机网络面临的主要风险包括利用系统漏洞、暴力破解密码、病毒和木马、系统扫描、DoS、网络钓鱼和中间人攻击&#xff08;MITM&#xff09;等…