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].
Solution1: Round1
思路:
Time Complexity: O(mn) Space Complexity: O(1)
Solution1 Code:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;
int m = matrix.length;
int n = matrix[0].length;
// four borders
int right = n - 1;
int down = m - 1;
int left = 0;
int up = 1;
// start
int row = 0, col = 0;
while(true) {
// to the right
while(col <= right) {
result.add(matrix[row][col++]);
}
col--; // step back
row++; // next
right--; // change border
if((row < up || row > down) && (col < left || col > right)) break;
// downwards
while(row <= down) {
result.add(matrix[row++][col]);
}
row--; // step back
col--; // next
down--; // change border
if((row < up || row > down) && (col < left || col > right)) break;
// to the left
while(col >= left) {
result.add(matrix[row][col--]);
}
col++; // step back
row--; // next
left++; // change border
if((row < up || row > down) && (col < left || col > right)) break;
// upwards
while(row >= up) {
result.add(matrix[row--][col]);
}
row++; // step back
col++; // next
up++; // change border
if((row < up || row > down) && (col < left || col > right)) break;
}
return result;
}
}