1.leetcode59,构造n*n的螺旋矩阵
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> A(n,vector<int>(n,0));
int upper=0;
int base=n-1;
int k=1;
//螺旋圈数
for(int cnt=0;cnt<n/2+1;cnt++)
{
//具体螺旋线实现
//右
for(int i=upper;i<=base;i++)
{
A[upper][i]=k++;
}
//下
for(int i=upper+1;i<=base;i++)
{
A[i][base]=k++;
}
//左
for(int i=base-1;i>=upper;i-- )
{
A[base][i]=k++;
}
//上
for(int i=base-1;i>=upper+1;i--)
{
A[i][upper]=k++;
}
upper++;
base--;
}
return A;
}
};
2.leetcode 54
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
int Vbase=0,Vupper=m-1;
int Hbase=0,Hupper=n-1;
vector<int> result(m*n,0);
int k=0;
//螺旋圈数
for(int cnt=0;cnt<m/2+1;cnt++)
{
//具体螺旋线实现
if(Hbase>Hupper||Vbase>Vupper) return result;
//右
for(int i=Hbase;i<=Hupper;i++)
{
result[k++]=matrix[Vbase][i];
}
//下
for(int i=Vbase+1;i<=Vupper;i++)
{
result[k++]=matrix[i][Hupper];
}
//左
if(Hbase==Hupper||Vbase==Vupper) return result;
for(int i=Hupper-1;i>=Hbase;i-- )
{
result[k++]=matrix[Vupper][i];
}
//上
for(int i=Vupper-1;i>=Vbase+1;i--)
{
result[k++]= matrix[i][Hbase];
}
Vupper--; Hupper--;
Vbase++; Hbase++;
}
return result;
}
};
下面贴上神级大佬的代码:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return ans;
int u = 0, d = matrix.length - 1;
int l = 0, r = matrix[0].length - 1;
while (true) {
for (int i = l; i <= r; i++) { // 左->右
ans.add(matrix[u][i]);
}
if (++u > d) break;
for (int i = u; i <= d; i++) { // 上->下
ans.add(matrix[i][r]);
}
if (--r < l) break;
for (int i = r; i >= l; i--) { // 右->左
ans.add(matrix[d][i]);
}
if (--d < u) break;
for (int i = d; i >= u; i--) { // 下->上
ans.add(matrix[i][l]);
}
if (++l > r) break;
}
return ans;
}
}