描述
给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。
样例
样例 1:
输入: [[1]]
输出: [1]
样例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10, 11, 12]
]
输出: [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
思路
1 采用分圈处理的方法。在子矩阵中用左上角坐标(tR,tC)和右下角坐标(dR,dC)就可表示一个子矩阵
2 采用fromUp标记是从左下到右上,还是从右上到左下
3 上坐标先沿着第一行运动(tC++),当到最后一行最右边,再沿着最后一列移动(tR++)
4 下坐标先沿着第一列运动(dR++),当到最后一行最右边,再沿着最后一行移动(dC++)
实现
class Solution {
public:
/**
* @param matrix: An array of integers
* @return: An array of integers
*/
vector<int> printZMatrix(vector<vector<int>> &matrix) {
// write your code here
vector<int> res;
int tR=0;
int tC=0;
int dR=0;
int dC=0;
int endR = matrix.size()-1;
int endC = matrix[0].size()-1;
bool fromUp=false;
while(tR != endR + 1)
{
help(matrix,res,tR,tC,dR,dC,fromUp);
tR = tC == endC ? tR + 1 : tR;
tC = tC == endC ? tC : tC + 1;
dC = dR == endR ? dC + 1 : dC;
dR = dR == endR ? dR : dR + 1;
fromUp=!fromUp;
}
return res;
}
void help(vector<vector<int>> &matrix,vector<int> &res,int tR,int tC,int dR,int dC,bool fromUp)
{
if(fromUp)
{
while(tR != dR + 1)
{
res.push_back(matrix[tR++][tC--]);
}
}else
{
while(dR != tR - 1)
{
res.push_back(matrix[dR--][dC++]);
}
}
}
};