解题思路:根据题目有两种遍历方向开始为右上,然后方向改为左下,依次循环
大致思路是这样的,每次循环把一个方向的数据放入答案数组中,到达边界,改变方向;
1.确定循环次数
- 对于m*n矩阵,所有方向应该有m+n-1次
2.方向变更
这个问题也比较简单,对于遍历次数对2取余即可
代码大概框架
int rowLength = matrix.length;
int columnLength = matrix[0].length;
int[] answer = new int[rowLength * columnLength];
int count = rowLength + columnLength - 1;
int m = 0;
int n = 0;
int answerIndex = 0;
for (int i = 0; i < count; i++) {
if (i % 2 == 0) {
//下一步内容 右上方向
}else{
//下一步内容 左下方向
}
}
代码块
3.右上方向
- m,n代表横纵坐标,右上方向的移动为m–,n++ 根据这两个条件的话,在正常范围内的条件为m >= 0 && n <
columnLength,
只要横坐标不减到负数,纵坐标不大于列数,
往数组添加元素的动作就可以继续下去,
while (m >= 0 && n < columnLength) {
answer[answerIndex] = matrix[m][n];
answerIndex++;
m--;
n++;
}
3.1越界处理
在右上方向的尽头有这么两种情况
1.n<columnLength 1到2的情形
这种情况m–即可
2.n>=columnLength 3到6的情形
这种呢m需要加2,n–即可
while (m >= 0 && n < columnLength) {
answer[answerIndex] = matrix[m][n];
answerIndex++;
m--;
n++;
}
if (n < columnLength) {
m++;
} else {
m = m + 2;
n--;
}
四.左下方向
请仔细思考右上方向的做法,理解后这里能写出来的。这里不做叙述
5.全部代码
public static int[] findDiagonalOrder(int[][] matrix) {
if (matrix.length == 0) {
return new int[0];
}
int rowLength = matrix.length;
int columnLength = matrix[0].length;
int[] answer = new int[rowLength * columnLength];
int count = rowLength + columnLength - 1;
int m = 0;
int n = 0;
int answerIndex = 0;
for (int i = 0; i < count; i++) {
if (i % 2 == 0) {
while (m >= 0 && n < columnLength) {
answer[answerIndex] = matrix[m][n];
answerIndex++;
m--;
n++;
}
if (n < columnLength) {
m++;
} else {
m = m + 2;
n--;
}
} else {
while (m < rowLength && n >= 0) {
answer[answerIndex] = matrix[m][n];
answerIndex++;
m++;
n--;
}
if (m < rowLength) {
n++;
}else{
m--;
n=n+2;
}
}
}
return answer;
}
如果本篇对你有帮助,希望能得到你的一个赞,让更多人看到这篇题解ovo