原题地址:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
题目描述:
解题方案:
无论是递归还是迭代,本质都是上下左右分别设定一个边界值,每走过一条边边界值就收缩1。
参考:顺时针打印矩阵
代码:
迭代:
class Solution {
public int[] spiralOrder(int[][] matrix) {
int m = matrix.length;
if(m == 0) return new int[0];
int n = matrix[0].length;
int[] res = new int[m * n];
int l = 0, r = n - 1, t = 0, b = m - 1;
int pos = 0;
while(true)
{
for(int i = l; i <= r; i ++) res[pos ++] = matrix[t][i];
if(++ t > b) break;
for(int i = t; i <= b; i ++) res[pos ++] = matrix[i][r];
if(-- r < l) break;
for(int i = r; i >= l; i --) res[pos ++] = matrix[b][i];
if(-- b < t) break;
for(int i = b; i >= t; i --) res[pos ++] = matrix[i][l];
if(++ l > r) break;
}
return res;
}
}
递归:
class Solution {
int[] res;
int pos;
public int[] spiralOrder(int[][] matrix) {
int m = matrix.length;
if(m == 0) return new int[0];
int n = matrix[0].length;
res = new int[m * n];
pos = 0;
print(0, n - 1, 0, m - 1, matrix);
return res;
}
public void print(int left, int right, int top, int bottom, int[][] matrix)
{
for(int i = left; i <= right; i ++) res[pos ++] = matrix[top][i];
top ++;
if(left > right || top > bottom) return;
for(int i = top; i <= bottom; i ++) res[pos ++] = matrix[i][right];
right --;
if(left > right || top > bottom) return;
for(int i = right; i >= left; i --) res[pos ++] = matrix[bottom][i];
bottom --;
if(left > right || top > bottom) return;
for(int i = bottom; i >= top; i --) res[pos ++] = matrix[i][left];
left ++;
print(left, right, top, bottom, matrix);
}
}