题意理解
给定一个矩阵,按照棒棒糖顺时针旋转,得到一个数组,打印该数组
问题分析
设置一个访问过数组,一个大循环内套4个小循环,分别是上,右,下,左。大循环条件是长度等于矩阵元素数量。
其他
这个就是模拟,搞清楚就可以了。
链接
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int m = matrix.size();
if (m == 0) return res;
int n = matrix[0].size();
int max_len = m * n;
vector<vector<int>> visited(m, vector<int>(n));
int len = 0;
int i = 0, j = 0;
//cout << "start" << endl;
while(len < max_len) {
//cout << "loop " << endl;
for (j = j; j < n && visited[i][j] == 0; j++) {
//cout << "eee" << endl;
//cout << "上 i j val" << '\t' << i << '\t' << j << '\t' << matrix[i][j] << endl;
res.push_back(matrix[i][j]);
visited[i][j] = 1;
len++;
}
i++; j--;
for (i = i; i < m && visited[i][j] == 0; i++) {
//cout << "右 i j val" << '\t' << i << '\t' << j << '\t' << matrix[i][j] << endl;
res.push_back(matrix[i][j]);
visited[i][j] = 1;
len++;
}
j--; i--;
for(j = j ; j >= 0 && visited[i][j] == 0; j--) {
//cout << "下 i j val" << '\t' << i << '\t' << j << '\t' << matrix[i][j] << endl;
res.push_back(matrix[i][j]);
visited[i][j] = 1;
len++;
}
i--; j++;
//cout << "左 " << i << '\t' << j << endl;
for(i = i; i >= 0 && visited[i][j] == 0; i--) {
//cout << "左 i j val" << '\t' << i << '\t' << j << '\t' << matrix[i][j] << endl;
res.push_back(matrix[i][j]);
visited[i][j] = 1;
len++;
}
i++;j++;
}
return res;
}
};