将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。
解法一
可以先转置,然后把每列对称交换交换一下
publicvoidrotate(int[][] matrix) { //以对角线为轴交换for (inti=0; i<matrix.length; i++) { for (intj=0; j<=i; j++) { if (i==j) { continue; } inttemp=matrix[i][j]; matrix[i][j] =matrix[j][i]; matrix[j][i] =temp; } } //交换列for (inti=0, j=matrix.length-1; i<matrix.length/2; i++, j--) { for (intk=0; k<matrix.length; k++) { inttemp=matrix[k][i]; matrix[k][i] =matrix[k][j]; matrix[k][j] =temp; } } }
时间复杂度:O(n²)。
空间复杂度:O(1)。
也可以先以横向的中轴线为轴,对称的行进行交换,然后再以对角线交换。
解法二
我把这个链接的思路贴过来,里边评论有张图也都顺道贴过来吧,写的很好。
一圈一圈的循环交换,很妙!
publicvoidrotate(int[][] matrix) { intn=matrix.length; for (inti=0; i<n/2; i++) for (intj=i; j<n-i-1; j++) { inttmp=matrix[i][j]; matrix[i][j]=matrix[n-j-1][i]; matrix[n-j-1][i]=matrix[n-i-1][n-j-1]; matrix[n-i-1][n-j-1]=matrix[j][n-i-1]; matrix[j][n-i-1]=tmp; } }
时间复杂度:O(n²)。
空间复杂度:O(1)。
总
这道题就是对题目的特征进行观察就可以了。