Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all
elements of the matrix in spiral order.Example 1:
Input:
[ [ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ] ]
Output:
[1,2,3,6,9,8,7,4,5] Example 2:Input: [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12] ]
Output:
[1,2,3,4,8,12,11,10,9,5,6,7]
思路
遍历数组的顺序是先向右然后下, 左, 上 然后右。。。
如果是一个4*4的矩阵, 对于最外面一圈相当于从[0,0]向右走3, 走到[0,2], 然后从[0,3]开始向下走3 走到[2,3] 然后从[3,3]向左走3 走到[3,1] 然后从[3,0]向上走3 走到[1,0]
可以看到对第i行, 他的对应坐标是i, m-i-1, 对于第j列 坐标是n-j-1
另外一个需要考虑的就是因为矩阵可能不是对称矩阵, 所以遍历完可能会出现多出一行或者一列的情况. 如果行列中最小的一个是单数, 那么则会出现这种情况, 所以最后需要盘点行/列中最小的是否是单数, 如果是则要把最后一行/列顺序遍历读出来
复杂度
时间复杂度O(mn)空间O(mn)
代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix.length == 0) {
return res;
}
int m = matrix.length;
int n = matrix[0].length;
int mid = Math.min(m, n)/2;
for (int i = 0; i < mid; i++) {
//向右
for (int j = i; j < n - i - 1; j++) {
res.add(matrix[i][j]);
}
//向下
for (int j = i; j < m - i -1; j++) {
res.add(matrix[j][n-i-1]);
}
//向左
for (int j = n - i - 1; j > i; j--) {
res.add(matrix[m-i-1][j]);
}
//向上
for (int j = m - i -1; j > i; j--) {
res.add(matrix[j][i]);
}
}
//如果多一行或者一列
if (Math.min(m, n)%2 == 1) {
if (m < n){//添加中间一行
for (int j = mid; j < n -mid; j++) {
res.add(matrix[mid][j]);
}
} else {//添加中间一列
for (int j = mid; j < m - mid; j++) {
res.add(matrix[j][mid]);
}
}
}
return res;
}
}
59. Spiral Matrix II
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Example:
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
这道题相当于是m和n相等的第一道题, 向上下左右的遍历的方式是一样的. 唯一不同是如果n为单数, 中间的数字是无法遍历到的. 所以要判定n是不是奇数, 如果是奇数要单独加上中间的值intmid
复杂度
时间O(nn) 空间O(nn)
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
if (n == 0) {
return res;
}
int mid = n/2;
int k = 1;
for (int i = 0; i < mid; i++) {
for (int j = i; j < n -i - 1; j++) {//向右
res[i][j] = k++;
}
for (int j = i; j < n - i - 1; j++) {//向下
res[j][n-i-1] = k++;
}
for (int j = n - i - 1; j>i ; j--) { //向左
res[n-i-1][j] = k++;
}
for (int j = n - i -1; j> i;j--) { //向上
res[j][i] = k++;
}
}
if (n%2 == 1) {
res[mid][mid] = k;
}
return res;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。