• 【刷题笔记8】LeetCode 48. 旋转图像(数组模拟)


    用分享的方式成长,用有趣的眼光看世界。 

    欢迎来到12 26 25的博客 
    热爱编码、算法、知识总结,不定期更新有趣、有料、有营养内容。 让我们共同学习,共同进步。

    系列索引 : 【刷题笔记0】系列目录索引(持续更新 & 推荐收藏)

    本题题目: LeetCode 48. 旋转图像

    分类: 数组,模拟,思维

    难度: 中等 

    老规矩,先上AC图:


    题目:

    48. 旋转图像(点击直达原网站)

    给定一个 × 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°整个数组矩阵,并要求不要 使用另一个矩阵来旋转图像,也就是在原矩阵中进行操作。

    分析题意首先我们必须遍历所有元素,所以最小时间复杂度O(N),另外数据量并不高,所以可以采用直接模拟方法,同时不准许开辟新的矩阵所以空间复杂度为1。

    整个题目不难,但是需要进行公示推导,有一个误区,有些同学可能会像既然旋转90°,那我一行一行旋转成列不就行了,但实际上仔细想想,当我们一行一行旋转时,上面行更新的状态在下面行旋转时会被二次处理,所以这样就会导致出错。

    结果如下:

     

    正确做法是考虑到每次旋转对4个边的变换,按照回字形进行变换,一次变换四个点,先外后内,这样就会避免重复处理。

    这里需要我们进行各个点的变换公示推导

    1. //i为第几层口字形数据,j为列
    2.                 int num = matrix[i][j];
    3.                 matrix[i][j] = matrix[n-1-j][i];
    4.                 matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
    5.                 matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
    6.                 matrix[j][n-1-i] = num;

    这里还有两点小tips:

    1. 需要对第一个元素数据先存储,后面会对这个位置进行更新。

    2.  旋转90°时最后一列是第一次就已经被更新过,所以遍历列(j)时不用到最后一个,倒数第二个即可。

    代码如下:

    1. class Solution {
    2. public:
    3. void rotate(vectorint>>& matrix) {
    4. int n = matrix.size();
    5. //i为第几层口字形数据,j为列
    6. for(int i = 0; i < n; i++){
    7. for(int j = i; j < n-1-i; j++){
    8. int num = matrix[i][j];
    9. matrix[i][j] = matrix[n-1-j][i];
    10. matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
    11. matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
    12. matrix[j][n-1-i] = num;
    13. }
    14. }
    15. }
    16. };

     上一篇: 从B站 (哔哩哔哩) 泄露的源码里发现了B站视频推荐的秘密

    下一篇: 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了

    如果有什么要补充的,欢迎下方👇评论区留言~

    1份赞许 = 100分的认可,如果感觉还不错,点个赞👍 支持一下吧 ~

    不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 🤝 我的博客 ,期待在这与你相遇 ~

  • 相关阅读:
    Numpy 的简单使用(一)
    视图/存储过程/触发器
    centos start ssh service
    训练记录day13 (想起来今天还没发博客
    Prometheus+Grafana可视化监控【Redis状态】
    【PyTorch】TensorBoard基本使用
    GPT-4V:AI在教育领域的应用
    Linux bash参数解析
    2022年全球及中国工程流体Engineered Fluids行业头部企业市场占有率及排名调研报告
    【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2
  • 原文地址:https://blog.csdn.net/qq_41523096/article/details/126715974