Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
Subscribe to see which companies asked this question.
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> rst = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0)
return rst;
int rows = matrix.length;
int cols = matrix[0].length;
int count = 0;
while(count * 2 < rows && count * 2 < cols){
for(int i = count; i < cols-count; i++)
rst.add(matrix[count][i]);
for(int i = count+1; i< rows-count; i++)
rst.add(matrix[i][cols-count-1]);
if(rows - 2 * count == 1 || cols - 2 * count == 1) // if only one row /col remains
break;
for(int i = cols-count-2; i>=count; i--)
rst.add(matrix[rows-count-1][i]);
for(int i = rows-count-2; i>= count+1; i--)
rst.add(matrix[i][count]);
count++;
}
return rst;
}
}
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
Subscribe to see which companies asked this question
public class Solution {
public int[][] generateMatrix(int n) {
// if(){}
int[][] arr=new int[n][n];
if(n==0){return arr;}
int sum=0,re=0;
while(re*2<n){
for(int i=re;i<n-re;i++){arr[re][i]=++sum;}
if(sum==n*n){return arr;}
for(int i=re+1;i<n-re;i++){arr[i][n-1-re]=++sum;}
// if(sum==n*n){return arr;}
for(int i=n-re-2;i>=re;i--){arr[n-1-re][i]=++sum;}
for(int i=n-re-2;i>re;i--){arr[i][re]=++sum;}
re++;
}
return arr;
}
}