当前位置: 首页 > news >正文

【LeetCode】螺旋矩阵旋转图像

​🌠 作者:@阿亮joy.
🎆专栏:《阿亮爱刷题》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉螺旋矩阵👈
    • 👉螺旋矩阵II👈
    • 👉旋转图像👈
    • 👉总结👈

👉螺旋矩阵👈

给你一个 m 行 n 列的矩阵 matrix ,请按照顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

在这里插入图片描述
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

思路:先分别定义上下左右边界curbelowleftright,当上边界大于下边界或者左边界大于右边界时,退出while循环。循环开始,首先,利用for循环向右遍历矩阵,依次将矩阵的元素加入到返回的数组中。第一个for循环结束,cur++,调整上边界并判断是否大于下边界。如果大于下边界就退出while循环,否则向下遍历矩阵。遍历的方式以及while循环的条件类似,在此就不赘述了。

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize)
{
    *returnSize = matrixSize * (*matrixColSize);//返回数组元素的个数
    int* ret = (int*)malloc(sizeof(int)*(*returnSize));
    int n = 0;//数组下标
    int cur = 0;//上边界
    int below = matrixSize - 1;//下边界
    int left = 0;//左边界
    int right = *matrixColSize - 1;//右边界
    int i = 0;
    while(1)
    {
        //向右遍历一行
        for(i = left; i <= right; i++)
        {
            ret[n++] = matrix[cur][i];
        }
        //调整上边界,若上边界大于下边界,则遍历矩阵完成
        cur++;
        if(cur > below) 
            break;
        //向下遍历一列
        for(i = cur; i <= below; i++)
        {
            ret[n++] = matrix[i][right];
        }
        //调整右边界,左边界大于右边界,则遍历矩阵完成
        right--;
        if(left > right)
            break;
        //向左遍历一行
        for(i = right; i >= left; i--)
        {
            ret[n++] = matrix[below][i];
        }
        //调整下边界,若上边界大于下边界,则遍历矩阵完成
        below--;
        if(cur > below)
            break;
        //向上遍历一列
        for(i = below; i >= cur; i--)
        {
            ret[n++] = matrix[i][left];
        }
        //调整左边界,左边界大于右边界,则遍历矩阵完成
        left++;
        if(left > right)
            break;
    }
    return ret;
}

在这里插入图片描述

👉螺旋矩阵II👈

给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。


示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

1 <= n <= 20

思路:我们可以借助螺旋矩阵的遍历的方式,依次给矩阵赋值。

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes)
{
    *returnSize = n;//函数
    *returnColumnSizes = (int*)malloc(sizeof(int)*n);//列数组
    int** ret = (int**)malloc(sizeof(int*)*n);
    int i = 0;
    for(i = 0; i < n; i++)
    {
        ret[i] = (int*)calloc(n, sizeof(int));//将矩阵中的元素初始化为0
        (*returnColumnSizes)[i] = n;//每一列元素的个数
    }

    int cur = 0;//上边界
    int left = 0;//左边界
    int right = n - 1;//右边界
    int below = n - 1;//下边界
    int count = 1;//元素
    while(1)
    {
        //向右遍历给矩阵赋值
        for(i = left; i <= right; i++)
        {
            ret[cur][i] = count;
            count++;
        }
        //调整上边界
        cur++;
        //判断上边界是否大于下边界,如果大于,赋值完成,退出循环
        if(cur > below)
            break;
        //向下遍历给矩阵赋值
        for(i = cur; i <= below; i++)
        {
            ret[i][right] = count;
            count++;
        }
        //调整右边界
        right--;
        //判断左边界是否大于右边界,如果大于,赋值完成,退出循环
        if(left > right)
            break;
        //向左遍历给矩阵赋值
        for(i = right; i >= left; i--)
        {
            ret[below][i] = count;
            count++;
        }
        //调整下边界
        below--;
        //判断上边界是否大于下边界,如果大于,赋值完成,退出循环
        if(cur > below)
            break;
        //向上遍历给矩阵赋值
        for(i = below; i >= cur; i--)
        {
            ret[i][left] = count;
            count++;
        }
        //调整左边界
        left++;
        //判断左边界是否大于右边界,如果大于,赋值完成,退出循环
        if(left > right)
            break;
    }
    return ret;
}

在这里插入图片描述

👉旋转图像👈

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

思路:先将矩阵中的元素上下对称交换,然后矩阵中的元素再关于对角线交换,就能达到将图像顺时针旋转 90 度的效果了。
在这里插入图片描述

//交换元素的值
void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void rotate(int** matrix, int matrixSize, int* matrixColSize)
{
    int i = 0;
    int j = 0;
    //上下交换
    for(i = 0; i < matrixSize / 2; i++)
    {
        for(j = 0; j < *matrixColSize; j++)
        {
            swap(&matrix[i][j], &matrix[matrixSize - 1 - i][j]);
        }
    }
    //对角线交换
    for(i = 0; i < matrixSize; i++)
    {
        for(j = 0; j < i; j++)
        {
            swap(&matrix[i][j], &matrix[j][i]);
        }
    }
    
}

在这里插入图片描述

👉总结👈

本篇文章主要讲解了挺经典的矩阵题目,尤其是旋转矩阵,对循环的把控需要掌握得很到位,才可能解得出来。可能这两道题目还有更加简便的解法,现在还未掌握,以后会加以补充。如果大家解决有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️

相关文章:

  • 猿创征文|网络原理——UDP/TCP协议
  • 理论第七课——sort
  • PyCharm利用pydevd-pycharm实现Python远程调试
  • Mysql中DQL(查询类)语句的执行顺序
  • CMake Tutorial 巡礼(2)_添加库
  • java毕业设计蛋糕店会员系统Mybatis+系统+数据库+调试部署
  • IntelliJ IDEA中构建Spring Boot的项目
  • 计算机视觉项目-实时目标追踪
  • 初始数据结构
  • Qt5开发从入门到精通——第六篇一节( 图像与图片——位置相关函数 )
  • 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
  • 计算机网络——物理层(互联网接入技术)
  • IntegralUI Web 22.3组件
  • 细说卷积神经网络(CNN)中所谓的“感受野”(Receptive Field)
  • Python 自动化教程(5) : 自动生成Word文件
  • python3.6+scrapy+mysql 爬虫实战
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android开源项目规范总结
  • E-HPC支持多队列管理和自动伸缩
  • Flannel解读
  • HTTP那些事
  • Invalidate和postInvalidate的区别
  • javascript 总结(常用工具类的封装)
  • js中forEach回调同异步问题
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • spark本地环境的搭建到运行第一个spark程序
  • SpingCloudBus整合RabbitMQ
  • Vue组件定义
  • Webpack入门之遇到的那些坑,系列示例Demo
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 关于for循环的简单归纳
  • 七牛云假注销小指南
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #DBA杂记1
  • $forceUpdate()函数
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (第61天)多租户架构(CDB/PDB)
  • (生成器)yield与(迭代器)generator
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十三)Maven插件解析运行机制
  • (译) 函数式 JS #1:简介
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • 、写入Shellcode到注册表上线
  • .jks文件(JAVA KeyStore)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 指南:抽象化实现的基类
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET企业级应用架构设计系列之结尾篇
  • ::前边啥也没有
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [383] 赎金信 js
  • [ACTF2020 新生赛]Include