题目描述
思路
- 确定好坐标系后,
- 往右上扫:
i + 1, j - 1 - 往左下扫:
i - 1, j + 1
- 往右上扫:
- 几个易错点:
-
坐标系的初始化
-
ij坐标在取matrix[]元素时的写法
-
扫描次数 = ?
-
怎么解决方向?
-
边界情况有几种?
-
代码
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix.length == 0) return new int[0];
int m = matrix[0].length;
int n = matrix.length;
int k = m + n - 1;//穿插次数
int[] res = new int[m * n];
int i = 0, j = 0;//坐标系初始化成:要以左上角为零点,i是纵轴,j是横轴
int count = 0;//结果集指针
for (int times = 0; times < k; times++) {
//向右上扫
if (times % 2 == 0) {
while(i >= 0 && j < m) {
res[count] = matrix[i][j];
count++;
i--;
j++;
}
if (j < m) {//把坐标放到下一次扫(向左下扫)的起点,红色情况1
i++;
} else {//把坐标放到下一次扫(向左下扫)的起点,红色情况2
i += 2;
j--;
}
} else {
//向左下扫
while (i < n && j >= 0) {
res[count] = matrix[i][j];
count++;
i++;
j--;
}
if (i < n) {//把坐标放到下一次扫(向右上扫)的起点,蓝色情况1
j++;
} else {//把坐标放到下一次扫(向右上扫)的起点, 蓝色情况2
i--;
j += 2;
}
}
}
return res;
}
}