|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
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;
//从上往下
for(int i=row1;i<row2;i++)
{
result.push_back(matrix[i][col2-1]);
}
col2--;
if(col1>=col2) break;
//从右往左
for(int i=col2-1;i>=col1;i--)
{
result.push_back(matrix[row2-1][i]);
}
row2--;
if(row1>=row2) break;
//从下往上
for(int i=row2-1;i>=row1;i--)
{
result.push_back(matrix[i][col1]);
}
col1++;
if(col1>=col2) break;
}
return result;
}
};
麻烦各位大佬问一下,怎么突然间发现 if(row1>=row2) break; while (true)是什么意思啊这不就只是打印了最外圈吗
本帖最后由 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.
所有行打印完和所有列打印完这两个条件满足一个就表示数组输出结束了。
|
|