leetcode旋转矩阵

旋转矩阵
题目描述:
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90度。不占用额外内存空间能否做到?
 
思路解析:
第一步:熟读题目十遍.
  由于原题规定不能占用额外内存空间,虽然我也不知道这句话具体指什么,是不能定义变量呢,还是什么?但是我可以先不管他,姑且先理解为不能扩展数组的空间吧,也就是说不能用push,unshift,shift,pop等方法呗(谁让他不说点我听得懂的话呢)
第二步:找规律
  对比示例中的两个数组,旋转90度,先看四条边:
  1.首先四个角,7到了1的位置,1到了3的位置,3到了9的位置,9到了7的位置;
  2.然后中间的数字,2到了6的位置,6到了8的位置,8到了4的位置,4到了2的位置;
  那么可以找到规律(用二位数组表示)
  总结:每一组数的最后一位移到第一位,其他一律往后移一位(1,3,9,7—》7,1,3,9)
  用下标(matrix[i][j])来表示规律中的位置:
    第一个数(也就是1或2):matrix[i][j]
    第二个数(也就是3或6):matrix[j][matrix.length-i-1]
    第三个数(也就是9或8):matrix[matrix.length-i-1][matrix.length-1-j]
    第四个数(也就是7或4):matrix[matrix.length-1-j][i]]
  那么根据上面的总结,得出:
[matrix[i][j],matrix[j][matrix.length-i-1],matrix[matrix.length-i-1][matrix.length-1-j],matrix[matrix.length-1-j][i]]
=
[matrix[matrix.length-1-j][i],matrix[i][j],matrix[j][matrix.length-i-1],matrix[matrix.length-i-1][matrix.length-1-j]]
 
所以,我们就循环数组在执行规律就ok了
 
var rotate = function(matrix) {
    let arrL = matrix.length
    for(let i=0; i < arrL; i++){
        if( i < parseInt(arrL/2)) {
            let arr2 = arrL-i-1
            for(let j=i; j < arr2; j++){
                [matrix[i][j],matrix[j][arr2],matrix[arr2][arrL-1-j],matrix[arrL-1-j][i]] =
                [matrix[arrL-1-j][i],matrix[i][j],matrix[j][arr2],matrix[arr2][arrL-1-j]]
            }
        }
    }
    return matrix;
};
叮叮叮:if( i < parseInt(arrL/2)) 这个是什么意思呢,因为每次执行规律的时候是四四一起替换的,而替换过的数字就不能在动了,所以执行一半的循环就可以全部替换了。
 
哎,这种找规律题有点费脑,看看大神们的做法吧。
咦,有个兄弟的做法也比较好——倒序倒置法
1.先把矩阵按照1,5,9折线转置:
[matrix[i][j],matrix[j][i]]=[matrix[j][i],matrix[i][j]]
那就变成了:[1,4,7]
      [2,5,8]
      [3,6,9]
2.在把每一个数组进行倒序,就ok了(牛批)
posted @ 2020-04-13 17:53  殇恨  阅读(705)  评论(0)    收藏  举报