JAVA算法练习题day17
今天花了好多时间啊,以后就思考20分钟吧,但是是全神贯注的思考和笔推公式,不能空想。不过这次确实想出来了,就是细节还是差了。
20.旋转图像
错误解法:实在想不出来了,“原地”就很难。还是自己没想到位。
class Solution {public void rotate(int[][] matrix) {//第0行成为最后一列,第1行成为倒数第二列,第i行成为n-i-1列。//按“成为”行列对应关系,遍历对应的行与列。按照遍历的位次 依次交换他们的元素。//错在“交换” ’成为‘ 应当是单向的赋值。但是被赋值的列,原本的元素又该怎么做?//难在“原地” for(int i = 0;i < matrix.length ; i++){//row i 对应col n-i-1for(int j = 0 ; j<matrix.length ; j++){int tmp = matrix[j][matrix.length - i - 1];matrix[j][matrix.length - i - 1] = matrix[i][j];matrix[i][j] = tmp;}}}
}
如果用辅助空间,自己是想出来了,但是要注意一些细节(矩阵赋值 new出来的东西赋值不能靠变量名= 来做)。
具体代码:
class Solution {public void rotate(int[][] matrix) {for(int i = 0 ;i < matrix.length/2 ; i++){for(int j=0;j<matrix.length;j++){int tmp = matrix[i][j];matrix[i][j]=matrix[matrix.length-i-1][j];matrix[matrix.length-i-1][j]=tmp;}}for(int i = 0 ;i < matrix.length ; i++){//j<matrix.length 相当于没翻转。。。//注意细节!!!!还是写好公式再CODE比较稳妥for(int j=0;j<i;j++){int tmp = matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=tmp;}}}
}
然后发现(也看了力扣的题解)先上下翻折,然后对角线折就可以。
class Solution {public void rotate(int[][] matrix) {for(int i = 0 ;i < matrix.length/2 ; i++){for(int j=0;j<matrix.length;j++){int tmp = matrix[i][j];matrix[i][j]=matrix[matrix.length-i-1][j];matrix[matrix.length-i-1][j]=tmp;}}for(int i = 0 ;i < matrix.length ; i++){//j<matrix.length 相当于没翻转。。。//注意细节!!!!还是写好公式再CODE比较稳妥for(int j=0;j<i;j++){int tmp = matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=tmp;}}}
}