Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
Example:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,4,7,5,3,6,8,9] Explanation:
Note:
The total number of elements of the given matrix will not exceed 10,000.
分析
对角线的每一行都有一个特点就是 i + j 是固定的。所以我们遍历所有的i + j的范围是[0, row + col + 2]。
当i+j是偶数的时候,我们就取col从[0, i+j]开始取值。
当i+j是奇数的时候,我们就取row从[0, i + j]开始取值。其中要注意坐标不能越界。
Code
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> res;
int row = matrix.size();
if (row == 0)
return res;
int col = matrix[0].size();
for (int i = 0; i <= row + col -2; i ++)
{
if (i%2 == 1)
{
for (int m = max(i-col+1, 0); m <= i && m < row; m ++)
{
res.push_back(matrix[m][i-m]);
}
}
else
{
for (int m = max(0, i-row+1); m <= i && m < col; m ++)
{
res.push_back(matrix[i-m][m]);
}
}
}
return res;
}
};
运行效率
Runtime: 88 ms, faster than 44.67% of C++ online submissions for Diagonal Traverse.
Memory Usage: 15 MB, less than 66.28% of C++ online submissions forDiagonal Traverse.