Leetcode hot100 旋转图像【中等】
凭直觉很自然想到写个while循环由外向内一圈一圈弄再想每一圈怎么弄。每一圈怎么弄也是靠直觉。比如下面这个矩阵。1 2 3 4 44 5 6 4 47 8 9 4 41 1 1 1 44 4 4 4 4以最外圈举例最外圈要这样走一遍就能完成旋转。好了思路有了现在开始写代码了。首先直觉告诉我每一圈的最左上角的元素由于是(0,0)、(1,1)、(2,2)这种既能用来表示这是第几圈又能用来判断是否走到最后一圈同时横坐标和纵坐标还一样具有这么多特性那我必须得维护这个参数啊。由于是每一圈的起点位置所以我管他叫start。初始化第一圈的时候 int start0;然后我们开始想退出while循环的条件如果正方形的长度是奇数那么最后剩一个元素如果正方形的长度是偶数那么最后一圈没有元素。我隐隐约约感受到可以用start和矩阵长度之间的关系去判断。当起点(start,start)坐标到了长度n的一半的时候就该退出了具体是小于号还是小于等于号列几个情况去分析一下。每一圈的旋转咋写呢首先要确定每一圈要转几个元素。最外圈需要动4个元素图中红框框出的这4个再往里一圈需要动2个元素图中绿框框出的这2个分析一下得到需要转动的元素个数int numn-2*start-1;接下来我们就要找每个元素旋转的规律了。先把所有元素的旋转先写下来找规律只需要写两圈的就能看出来规律。最外圈start0,num4(0,0)-(4,0)-(4,4)-(0,4)-(0,0)(0,1)-(3,0)-(4,3)-(1,4)-(0,1)(0,2)-(2,0)-(4,2)-(2,4)-(0,2)(0,3)-(1,0)-(4,1)-(3,4)-(0,3)倒数第二圈start1,num2(1,1)-(3,1)-(3,3)-(1,3)-(1,1)(1,2)-(2,1)-(3,2)-(2,3)-(1,2)竖着看我在图里写了几个你找找感觉找到感觉后整个规律就出来了matrix[start][starti]-matrix[startnum-i][start]-matrix[startnum][startnum-i]-matrix[starti] [startnum]-matrix[start][starti]还有一个视角更快出规律先用4个角去写[start][start]-[startnum][start]-[startnum][startnum]-[start][startnum]-[start][start]↓这是第0个再考虑如何迁移到下一个第i个——行数如何变列数如何变matrix[start][starti]- matrix[startnum-i][start] -matrix[startnum][startnum-i] -matrix[starti] [startnum]-matrix[start][starti]class Solution { public void rotate(int[][] matrix) { int n matrix.length; //特殊情况 if(n1) return; int start0; // n3 start1停下 // n4 start2停下 // n5 start2停下 // n6 start3停下 //由外到内一圈一圈的搞直到最内圈是长度为1的小正方形,或者长度为0,停下 while(startn/2){ // start0循环n-1次 // start1循环6-2start-1次 // start2 循环1次 6-2start-1次 int numn-2*start-1; //这一轮每一行有多少个要旋转的元素 for(int i0; inum; i){ int tempmatrix[start][starti]; matrix[start][starti]matrix[startnum-i][start]; matrix[startnum-i][start]matrix[startnum][startnum-i]; matrix[startnum][startnum-i]matrix[starti][startnum]; matrix[starti][startnum]temp; } start;//下一圈的起点是(start,start) } } }