题目:对角线遍历
问题描述:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
解决思路:
根据上面的图我们可以得到如下信息:
1、遍历的方向有两个:先是"右上"方向,然后是"左下"方向,然后再是"右上"方向,再是"左下"方向... ...
2、遍历有4种临界情况:当继续向下遍历的元素的行或列小于0时(分别对应于元素1和元素4的情况);当继续向下遍历的元素的行或列超出数组的行或列时(分别对应于元素8和元素3的情况)。并且应当注意当发生这种临界情况时,遍历的方向也会发生相应的变化。
有了以上的信息,我们就可以定义一个二维数组tran来表示遍历的方向,它的两个值就分别代表"右上"和"左下"。
再定义一个变量k来负责控制遍历方向的变化,一旦发生上面所说临界情况中的一种,就改变遍历方向。
解决代码:
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0) {
return new int[]{};
}
int rowNum = matrix.length;
int colNum = matrix[0].length;
int[] arr = new int[rowNum * colNum];
int[][] tran = {{-1, 1}, {1, -1}};
int k = 0;
int row = 0;
int col = 0;
for(int i = 0; i < arr.length; i++) {
arr[i] = matrix[row][col];
row += tran[k][0];
col += tran[k][1];
// 临界情况
if(row > rowNum - 1) {
row = rowNum - 1;
col += 2; // 在进入该代码块之前col已经减去了1,所以为了达到col+1的效果,我们需要将col加2
k = 1 - k; // 变化遍历方向
}
if(col > colNum - 1) {
col = colNum - 1;
row += 2; // 在进入该代码块之前row已经减去了1,所以为了达到row+1的效果,我们需要将row加2
k = 1 - k;
}
if(row < 0) {
row = 0;
k = 1 - k;
}
if(col < 0) {
col = 0;
k = 1 - k;
}
}
return arr;
}
}