因爲可能出現行和列的數值不一樣,所以採用上下左右的標識遍歷,且實時更新,判斷是否已遍歷完了
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>res;
if(matrix.size()==0)return res;
int left=0,right=matrix[0].size()-1;
int up=0,down=matrix.size()-1;
for(;left<=right&&up<=down;)
{
for(int j=left;j<=right;j++)res.push_back(matrix[up][j]);
up++;
//更新了up,需要判斷是否超出,超出推出循環
if(up>down)break;
for(int i=up;i<=down;i++)res.push_back(matrix[i][right]);
right--;
//更新了right,需要判斷是否超出,超出推出循環
if(left>right)break;
//如果上面豎,行,都存在,那邊下面代碼也肯定存在,
for(int j=right;j>=left;j--)res.push_back(matrix[down][j]);
down--;
for(int i=down;i>=up;i--)res.push_back(matrix[i][left]);
left++;
}
return res;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>res;
if(matrix.size()==0)return res;
int left=0,right=matrix[0].size()-1;
int up=0,down=matrix.size()-1;
for(;left<=right&&up<=down;)
{
//(left<=right&&up<=down) 每個條件判斷,效率不高
for(int j=left;j<=right&&(left<=right&&up<=down);j++)res.push_back(matrix[up][j]);
up++;
for(int i=up;i<=down&&(left<=right&&up<=down);i++)res.push_back(matrix[i][right]);
right--;
for(int j=right;j>=left&&(left<=right&&up<=down);j--)res.push_back(matrix[down][j]);
down--;
for(int i=down;i>=up&&(left<=right&&up<=down);i--)res.push_back(matrix[i][left]);
left++;
}
return res;
}
};
因爲是行和列都是一樣的,所以只用兩個標識遍歷,且不是實時更新,如果更新了後面無法遍歷了
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//用一個行,和一個列標識就可以遍歷了
int row=0,col=n-1;
vector<vector<int>>res(n,vector<int>(n,-1));
int m=1;
for(;row<=col;row++,col--)
{
for(int c=row;c<=col;c++)res[row][c]=m++;
for(int s=row+1;s<=col;s++)res[s][col]=m++;
for(int c=col-1;c>=row;c--)res[col][c]=m++;
//s>=row+1 別忘記了
for(int s=col-1;s>=row+1;s--)res[s][row]=m++;
}
return res;
}
};