class Solution {
public:
vector<int> spiralArray(vector<vector<int>>& array) {
vector<int> res; //答案数组
if(array.size() == 0 || array[0].size() == 0) return res;
int n = array.size(), m = array[0].size();
vector<vector<bool>> st(n, vector<bool>(m));
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; //0表示不变
for(int i = 0, x = 0, y = 0, d = 0; i < n * m; i++){
res.push_back(array[x][y]);
st[x][y] = true;
int a = x + dx[d], b = y + dy[d]; //得到下一步到达的坐标位置
//如果坐标出界或者到达的那个坐标已经访问过,需要改变方向
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]){
d = (d + 1) % 4; //4循环选 个方向
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};
class Solution {
public int[] spiralOrder(int[][] matrix) {
//从左向右、从上向下、从右向左、从下向上循环
if(matrix.length == 0) return new int[0];
int l = 0, r = matrix[0].length-1, t = 0, b = matrix.length - 1, x = 0;
int[] res = new int[(r + 1) * (b + 1)];
while(true){
for(int i = l; i <= r; i++) res[x++] = matrix[t][i];// left to right
if(++t > b) break;
for(int i = t; i <= b; i++) res[x++] = matrix[i][r];// top to bottom
if(l > --r) break;
for(int i = r; i >= l; i--) res[x++] = matrix[b][i];//right to left
if(t > --b) break;
for(int i = b; i >= t; i--) res[x++] = matrix[i][l];//bottom to top
if(++l > r) break;
}
return res;
}
}
class Solution {
public int[] spiralOrder(int[][] matrix) {
//经典顺序遍历 上下左右四个范围
if(matrixnull||matrix.length0) return new int[0];
int high = 0;
int low =matrix.length-1;
int left = 0;
int right = matrix[0].length -1;
int result[] = new int[matrix.length*matrix[0].length];
int a=0;
while(true)
{
for(int i=left;i<=right;i++)
{
result[a++]=matrix[high][i];
}
if(++high>low) break;
class Solution {
public int[] spiralOrder(int[][] mat) {
int n = mat.length;
if(n == 0) {
return new int[0];
}
int m = mat[0].length;
int k = 0;
int[] res = new int[n * m];
int left = 0, right = m - 1, up = 0, down = n - 1;
while(left <= right && up <= down) {
for(int i = left; i <= right; i ++) {
res[k ++] = mat[up][i];
}
up ++;
for(int i = up; i <= down; i ++) {
res[k ++] = mat[i][right];
}
right --;
for(int i = right; i >= left && up <= down; i --) {
res[k ++] = mat[down][i];
}
down --;
for(int i = down; i >= up && left <= right; i --) {
res[k ++] = mat[i][left];
}
left ++;
}
return res;
}
}
共以下 7 个回答
定义上下左右四个边界,每次遍历一行或一列以后将边界进行相应调整。
8.10 周四
Day31:下面是代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
//经典顺序遍历 上下左右四个范围
if(matrixnull||matrix.length0) return new int[0];
int high = 0;
int low =matrix.length-1;
int left = 0;
int right = matrix[0].length -1;
int result[] = new int[matrix.length*matrix[0].length];
int a=0;
while(true)
{
for(int i=left;i<=right;i++)
{
result[a++]=matrix[high][i];
}
if(++high>low) break;
}
有点绕