java:
class Solution {
public int[] spiralOrder(int[][] matrix) {
int[] mat;
int row = matrix.length;
if(row == 0)
{
mat = new int[0];
return mat;
}
int col = matrix[0].length;
mat = new int[row*col];
int cnt = 0;
int m = 0, n = row-1, p = 0, q = col-1; // 边界
int i = 0, j = 0; // 实时位置
while(m <= n && p <= q)
{
// 向右
if(cnt == row*col) break;
while(j <= q) mat[cnt++] = matrix[i][j++];
j--;
i++;
m++;
// 向下
if(cnt == row*col) break;
while(i <= n) mat[cnt++] = matrix[i++][j];
i--;
j--;
q--;
// 向左
if(cnt == row*col) break;
while(j >= p) mat[cnt++] = matrix[i][j--];
j++;
i--;
n--;
// 向上
if(cnt == row*col) break;
while(i >= m) mat[cnt++] = matrix[i--][j];
i++;
j++;
p++;
}
return mat;
}
}
C++:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int row = matrix.size();
if(row == 0) return vector<int>(0);
int col = matrix[0].size();
vector<int> mat;
int m = 0, n = row-1, p = 0, q = col-1; // 边界
int i = 0, j = 0; // 实时位置
while(m <= n && p <= q)
{
// 向右
if(mat.size() == row*col) break;
while(j <= q) mat.push_back(matrix[i][j++]);
j--;
i++;
m++;
// 向下
if(mat.size() == row*col) break;
while(i <= n) mat.push_back(matrix[i++][j]);
i--;
j--;
q--;
// 向左
if(mat.size() == row*col) break;
while(j >= p) mat.push_back(matrix[i][j--]);
j++;
i--;
n--;
// 向上
if(mat.size() == row*col) break;
while(i >= m) mat.push_back(matrix[i--][j]);
i++;
j++;
p++;
}
return mat;
}
};