• leetcode-48-旋转图像


    题目描述:

    给定一个 × n 的二维矩阵表示一个图像。

    将图像顺时针旋转 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]
    ]

     

    要完成的函数:

    void rotate(vector<vector<int>>& matrix) 

    说明:

    1、这道题给定一个二维matrix,要求将matrix顺时针旋转90度,原地修改matrix。

    2、如果这道题允许多定义一个matrix,来存储顺时针旋转之后的数值,这道题会容易许多。

    现在不允许,只能原地修改,那无非就是多定义几个临时变量,用来存储值,避免被覆盖掉而已。

    关于程序处理的技巧,笔者最开始想的是,把第一行映射到第四列,把第二行映射到第三列……这样子的做法,但是仔细一想,这样处理未免太过麻烦。

    我们也许可以用简单直接一点的方法来做,把matrix看成一个洋葱,第一次旋转最外层,接着旋转第二层,这样子我们每次旋转的时候只需要存储两个变量。

    而且这种方法看起来对于人类更加友好,便于设计程序。

    代码如下:(附详解)

        void rotate(vector<vector<int>>& matrix) 
        {
            int s1=matrix.size(),k=0,temp1,temp2;
            while(k<s1/2)//每一个外圈
            {
                //先处理四个边角,边角比较特殊
                temp1=matrix[k][k];//记录左上角原本的值
                temp2=matrix[k][s1-1-k];//记录右上角原本的值
                matrix[k][s1-1-k]=temp1;//更新右上角为temp1
                temp1=temp2;//temp1更新为右上角原本的值temp2
    
                temp2=matrix[s1-1-k][s1-1-k];//记录右下角的值
                matrix[s1-1-k][s1-1-k]=temp1;//更新右下角为temp1
                temp1=temp2;//更新为右下角原本的值
    
                temp2=matrix[s1-1-k][k];//记录左下角原本的值
                matrix[s1-1-k][k]=temp1;//更新左下角为temp1
    
                matrix[k][k]=temp2;//更新左上角为左下角原本的值
                
                //接着处理四条边中非边角的元素
                for(int j=k+1;j<=s1-1-k-1;j++)//比如四行四列的矩阵,这个循环要执行两次
                {                //每次执行一次循环,都会更新四个元素的值
                    temp1=matrix[k][j];
                    temp2=matrix[j][s1-1-k];
                    matrix[j][s1-1-k]=temp1;
                    temp1=temp2;
                    
                    temp2=matrix[s1-1-k][s1-1-j];
                    matrix[s1-1-k][s1-1-j]=temp1;
                    temp1=temp2;
                    
                    temp2=matrix[s1-1-j][k];
                    matrix[s1-1-j][k]=temp1;
                    temp1=temp2;
                    
                    matrix[k][j]=temp1;
                }
                k++;//处理下一圈
            }
        }
    

    上述代码实测4ms,beats 99.94% of cpp submissions。

  • 相关阅读:
    Info.plist的秘密(raywenderlich笔记)
    我所理解的性能测试中负载测试与压力测试的区别
    seo优化
    localStorage,sessionStorage那些事儿
    浏览器cookie那些事儿
    JavaScript--Ajax请求
    javascript-理解原型、原型链
    React Native:从入门到原理
    知道这 20 个正则表达式,能让你少写 1,000 行代码
    程序猿进化必读:让App的运行速度与响应速度趋于一流(iOS)
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9475779.html
Copyright © 2020-2023  润新知