☆打卡算法☆LeetCode 48、旋转图像 算法解析

简介: “给定一个二维矩阵表示一个图像,将图像顺时针旋转90°,返回旋转后的图像矩阵。”

一、题目


1、算法题目

“给定一个二维矩阵表示一个图像,将图像顺时针旋转90°,返回旋转后的图像矩阵。”

题目链接:

来源:力扣(LeetCode)

链接:48. 旋转图像 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

给定一个 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]]
复制代码


二、解题


1、思路分析

这道题,首先分析题目,将二维矩阵图像进行旋转:

网络异常,图片无法展示
|

可以看到,第一行旋转后恰好是倒数第一列的位置。

第二行旋转后,它出现在倒数第二列的位置。

对于矩阵中到的第三行和第四行同理,可以得到规律:

对于矩阵中第i行的第j个元素,在旋转后,出现在倒数第i行第j个位置。

将规律用代码演示就是:矩阵元素matrix[x][j]旋转后的新位置为matrixnew[y][n-x-1]。

这样就可以使用一个辅助数组来临时存储旋转后的记过,然后遍历矩阵中的每一个元素,根据规则将该元素放到辅助数组中对应的位置,在遍历完成之后,再将辅助数组中的结果复制到原数组中即可。


2、代码实现

代码参考:

public class Solution {
    public void Rotate(int[][] matrix) {
        int row=matrix.Length;
        if(row<=1)return;
        int[] leftUp=new int[]{0,0};
        int[] rightUp=new int[]{0,row-1};
        int[] leftDown=new int[]{row-1,0};
        int[] rightDown=new int[]{row-1,row-1};
        while(true){
            int Value=0;
            for(int i=0;i<rightUp[1]-leftUp[1];i++){
                int mid=matrix[leftUp[0]][leftUp[1]+Value];
                matrix[leftUp[0]][leftUp[1]+Value]=matrix[leftDown[0]-Value][leftDown[1]];//左上等于左下
                matrix[leftDown[0]-Value][leftDown[1]]= matrix[rightDown[0]][rightDown[1]-Value];//左下等于右下
                matrix[rightDown[0]][rightDown[1]-Value]=matrix[rightUp[0]+Value][rightUp[1]];//右下等于右上
                matrix[rightUp[0]+Value][rightUp[1]]=mid;//右上等于左上
                Value++;
            }
            leftUp[0]++;
            leftUp[1]++;
            rightUp[0]++;
            rightUp[1]--;
            if(rightUp[1]<=leftUp[1])break;
            leftDown[0]--;
            leftDown[1]++;
            rightDown[0]--;
            rightDown[1]--;
        }
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(N)

其中N是数组的长度。

空间复杂度: O(1)

只需要常数级别的空间存放变量。


三、总结

这道题需要从外向内一圈一圈的进行翻转。

对称的只要旋转一半即可。



相关文章
|
17天前
|
编解码 监控 算法
图像和视频处理中DSP算法的研究与发展
图像和视频处理中DSP算法的研究与发展
23 2
|
2天前
|
机器学习/深度学习 人工智能 算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
7 0
|
3天前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
8 0
|
7天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
19 0
|
12天前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。
|
13天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
13天前
|
存储 机器学习/深度学习 算法
|
15天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
30 3
|
15天前
|
算法 数据安全/隐私保护 数据格式
基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
该内容是一个关于混沌系统理论及其在图像加解密算法中的应用摘要。介绍了使用matlab2022a运行的算法,重点阐述了混沌系统的特性,如确定性、非线性、初值敏感性等,并以Logistic映射为例展示混沌序列生成。图像加解密流程包括预处理、混沌序列生成、数据混淆和扩散,以及密钥管理。提供了部分核心程序,涉及混沌序列用于图像像素的混淆和扩散过程,通过位操作实现加密。
|
17天前
|
存储 算法 安全

推荐镜像

更多