本帖最后由 major_lyu 于 2020-2-24 23:52 编辑 class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int row1 = 0, row2 = matrix.size();
int col1 = 0, col2 = matrix[0].size();
vector<int> result;
while (true)
{
//从左到右打印一行
for(int i=col1;i<col2;i++)
{
result.push_back(matrix[row1][i]);
}
row1++; // 指向最上面未打印的行
if(row1>=row2) break; // 如果所有行打印完了,终止while
//从上往下打印最右侧未打印的一列
for(int i=row1;i<row2;i++)
{
result.push_back(matrix[i][col2-1]);
}
col2--; //指向刚从上往下打印列号
if(col1>=col2) break; // 如果所有列打印完了, 终止while循环
//从右往左打印最下面未打印的一行
for(int i=col2-1;i>=col1;i--)
{
result.push_back(matrix[row2-1][i]);
}
row2--; //指向刚刚从左往右打印的一行
if(row1>=row2) break; // 如果所有行打印完了, 终止while循环
//从下往上打印最左侧未打印的一列
for(int i=row2-1;i>=row1;i--)
{
result.push_back(matrix[i][col1]);
}
col1++; // 指向最左侧未打印的列
if(col1>=col2) break;// 如果所有列打印完了, 终止while循环
}
return result;
}
};
while(true)是死循环的意思,循环一直进行,除非遇到break语句才会跳出循环。
根据代码分析可以知道,row1表示剩余未打印的元素最小行号,每完成一次从左往右打印,row1自增1指向下一行,也就是下次需要从左往右的行号,因此行号小于row1的行已经被打印过了。row2表示,上一次从右往左打印的行号, 每完成一次从右往左打印,row2自减1,因此行号大于等于row2的行已经被打印过了。
当row1大于等于row2时表示所有的行打印完了。
if(row1>=row2) break; 所有行打印完跳出while循环。
同样的道理,如果col1 >= col2,则表示所有列打印完了,也要跳出while.
所有行打印完和所有列打印完这两个条件满足一个就表示数组输出结束了。 |