Spiral Matrix II
Spiral Matrix II
问题:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
思路:
矩阵的旋转常用模板
我的代码1:
public class Solution { public int[][] generateMatrix(int n) { if(n < 0) return null; int[][] rst = new int[n][n]; int num = 1; for(int i = 0; i < n / 2; i++) { //left to right for(int k = i; k < n - 1 - i; k++) { rst[i][k] = num; num++; } //right to down for(int k = i; k < n - 1 - i; k++) { rst[k][n - i - 1] = num; num++; } //down to left for(int k = i; k < n - 1 - i; k++) { rst[n - i - 1][n - k - 1] = num; num++; } //left to top for(int k = i; k < n - 1 - i; k++) { rst[n - k - 1][i] = num; num++; } } if( n % 2 != 0) rst[n/2][n/2] = num; return rst; } }
我的代码2:
public class Solution { public int[][] generateMatrix(int n) { if(n < 0) return null; int[][] rst = new int[n][n]; int num = 1; int row = n; int x1 = 0, y1 = 0; while(row > 0) { int x2 = x1 + row - 1; int y2 = y1 + row - 1; //left to right for(int i = y1; i <= y2; i++) { rst[x1][i] = num++; } //right to down for(int i = x1 + 1; i < x2; i++) { rst[i][y2] = num++; } if(row == 1) break; //down to left for(int i = y2; i >= y1; i--) { rst[x2][i] = num++; } //left to top for(int i = x2 - 1; i > x1; i--) { rst[i][y1] = num++; } row -= 2; x1 ++; y1 ++; } return rst; } }
学习之处:
- 矩阵的旋转标准模式:模式为每一行或者每一列(n)只操作 n-1,这样firstrow,rightcol,lastrow,leftcol便能组成一圈,此种方法对于n为奇数不敏感,详见Roate Image。
- 若将矩阵旋转方法应用于矩阵赋值,出现当n为奇数时,判断很复杂,如n = 1 n-1=0 此时变无法赋值了,换句话说,如果要操作所有的对象,最后需加入判断matrix[n/2][n/2]处,详见我的代码1
- 为了防止奇数时的复杂判断,所以采用另外一种标准模式,对于行访问全行数据,数据量为row,对于列访问中间列的数据,也就是colNum - 2的数据量,详见我的代码2。通过确定左上角和右下角坐标的方法,代码还不容易出错,一个好方法。
posted on 2015-03-07 20:30 zhouzhou0615 阅读(162) 评论(0) 编辑 收藏 举报