Spiral Matrix II "Fill in"
Filled a square matrix with elements from 1 to n^2 in spiral order
Given n =3,
you should return the following matrix:
[
[1,2,3],
[8,9,4],
[7,6,5]
]
2. Implementation
Q1: using the technique used in Spiral order ?
A1: just using a count as a value to fill in the matrix,
top-> matrix[levelNum][j], j >= levelNum , j < matrix[0].length -levelNum -1
right-> matrix[i][matrix[0].length-1-levelNum], i>= levelNum, i < matrix.length-1-levelNum
bottom-> matrix[matri.length-1-levelNum][j], j < = matrix[0].length-1-levelNum , j > levelNum
left - > matrix[i][levelNum], i <= matrix.length -1 -levelNum , i > levelNum
Q1: what about rotate image ?
A1:
for (int levelNum= 0 , levelNum < size/2; levelNum++)
for (int j = levelNum; j< matrix.length-1-levelNum; j++)
int temp = matrix[levelNum][j];
matrix[levelNum][j] = matrix[matrix.length-1-j][levelNum];//topleft<-bottomleft
matrix[matrix.length-1-j][levelNum]= matrix[matrix.length-1-levelNum][matrix.length-1-j]// bottomleft<-bottomright
matrix[matrix.length-1-levelNum][matric.length-1-j] = matrix[j][matrix.length-1-levelNum]// botomright<-topright
matrix[j][matrix.length-1-levelNum] =temp;
// Time:O(nxn), Space:O(1) public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; // validate the input if ( n < 0) return matrix; int k =1; for (int levelNum = 0; levelNum < n/2; levelNum++) { // top for (int j = levelNum ; j < n - 1 -levelNum; j++) res[levelNum][j] = k++; // right for (int i = levelNum; i < n-1-levelNum; i++) res[i][n-1-levelNum] = k++; // bottom for (int j = n-1-levelNum; j > levelNum;j--) res[n-1-levelNum][j]= k++; // left for (int i= n-1 -levelNum; i > levelNum; i--) res[i][levelNum] = k++; } // Fro Square Matrix, odd length only got one element left inner most layer if (n%2 ==1) res[n/2][n/2] = k; return res; }
int [][] res = new int[n][n]; int k=1; int top = 0, bottom = n-1, left = 0, right = n-1; while (left < right && top < bottom) { for (int j = left; j < right;j++) res[top][j] = k++; for (int i =top; i < bottom; i++) res[i][right] = k++; for (int j = right ; j > left; j--) res[bottom][j] = k++; for (int i = bottom; i > top) res[i][left] = k++; left++; right--; top++; bottom--; } if (n%2 ==1) res[n/2][n/2] = k; return res;3. Similar ones
(M) Spiral Matrix
Rotate Image
No comments:
Post a Comment