题解 | #顺时针打印矩阵#
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
第六十一题 模拟第一题 方法2也不方便
方法1
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
// 两个方法,一种就是正常的遍历,每次修改上下左右的边界
// 还有一种就是:每次访问最外面一圈 然后递归调用
vector<int> retans;
int shang=0;
int xia=matrix.size()-1;
int zuo =0;
int you =matrix[0].size()-1;
while(true){
// 左到右
for (int i=zuo;i<=you;i++)
retans.push_back(matrix[shang][i]);
shang++;
if(shang>xia)
break;
// 上到下
for(int i=shang;i<=xia;i++)
retans.push_back(matrix[i][you]);
you--;
if(zuo>you)
break;
// 右到左
for(int i=you;i>zuo-1;i--)
retans.push_back(matrix[xia][i]);
xia--;
if(shang>xia)
break;
// 下到上
for(int i=xia;i>shang-1;i--)
retans.push_back(matrix[i][zuo]);
zuo++;
if(zuo>you)
break;
}
return retans;
}
};
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
// 两个方法,一种就是正常的遍历,每次修改上下左右的边界
// 还有一种就是:每次访问最外面一圈 然后递归调用
vector<int> retans;
int shang=0;
int xia=matrix.size()-1;
int zuo =0;
int you =matrix[0].size()-1;
while(true){
// 左到右
for (int i=zuo;i<=you;i++)
retans.push_back(matrix[shang][i]);
shang++;
if(shang>xia)
break;
// 上到下
for(int i=shang;i<=xia;i++)
retans.push_back(matrix[i][you]);
you--;
if(zuo>you)
break;
// 右到左
for(int i=you;i>zuo-1;i--)
retans.push_back(matrix[xia][i]);
xia--;
if(shang>xia)
break;
// 下到上
for(int i=xia;i>shang-1;i--)
retans.push_back(matrix[i][zuo]);
zuo++;
if(zuo>you)
break;
}
return retans;
}
};
方法2 标准答案 没必要递归啊。。。
class Solution {
public:
void print(int lx, int ly, int rx, int ry, vector<vector<int>> &matrix, vector<int> &ret) {
// 左到右边界
for (int j=ly; j<=ry; ++j)
ret.push_back(matrix[lx][j]);
// 上到下边界
for (int i=lx+1; i<=rx; ++i)
ret.push_back(matrix[i][ry]);
// 右到左边界
int h = rx - lx + 1;
if (h > 1)
for (int rj=ry-1; rj>=ly; --rj)
ret.push_back(matrix[rx][rj]);
// 下到上边界
int w = ry - ly + 1;
if (w > 1)
for (int ri = rx-1; ri>=lx+1; --ri)
ret.push_back(matrix[ri][ly]);
}
vector<int> printMatrix(vector<vector<int>>& matrix) {
// 方法二 一圈一圈的打印 直接抄答案了
vector<int> ret;
if (matrix.empty())
return ret;
// 每一圈的左右边界 通过传递上下左右的边界决定输出的结果
int lx = 0, ly = 0;
int rx = matrix.size()-1, ry = matrix[0].size()-1;
while (lx <= rx && ly <= ry) {
print(lx++, ly++, rx--, ry--, matrix, ret);
}
return ret;
}
};
public:
void print(int lx, int ly, int rx, int ry, vector<vector<int>> &matrix, vector<int> &ret) {
// 左到右边界
for (int j=ly; j<=ry; ++j)
ret.push_back(matrix[lx][j]);
// 上到下边界
for (int i=lx+1; i<=rx; ++i)
ret.push_back(matrix[i][ry]);
// 右到左边界
int h = rx - lx + 1;
if (h > 1)
for (int rj=ry-1; rj>=ly; --rj)
ret.push_back(matrix[rx][rj]);
// 下到上边界
int w = ry - ly + 1;
if (w > 1)
for (int ri = rx-1; ri>=lx+1; --ri)
ret.push_back(matrix[ri][ly]);
}
vector<int> printMatrix(vector<vector<int>>& matrix) {
// 方法二 一圈一圈的打印 直接抄答案了
vector<int> ret;
if (matrix.empty())
return ret;
// 每一圈的左右边界 通过传递上下左右的边界决定输出的结果
int lx = 0, ly = 0;
int rx = matrix.size()-1, ry = matrix[0].size()-1;
while (lx <= rx && ly <= ry) {
print(lx++, ly++, rx--, ry--, matrix, ret);
}
return ret;
}
};
题解 文章被收录于专栏
一遍做剑指offer 一边保存做题步骤 并附带详细注释哦