引入
本题可见leetcode第498
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
思路
其主要思路为,将大问题拆解为一个个“通过起始位置和终止位置输出对角线”的结果的集合,同时由于之字形存在着“左上–》右下”和“右上–》左下”两种情况,需要引入一个boolean变量在加以判断。
代码
import com.hpsyche.sort.utils.SortUtils;
import javax.xml.bind.SchemaOutputResolver;
import java.sql.SQLOutput;
/**
* @author Hpsyche
*/
public class FindDiagonalOrder {
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix == null) {
return null;
}
if(matrix.length==0){
return new int[]{};
}
int[] arr = new int[matrix.length * matrix[0].length];
findMethod(matrix, arr);
return arr;
}
private void findMethod(int[][] matrix, int[] arr) {
int height = matrix.length - 1;
int width = matrix[0].length - 1;
int count = 0;
int currBeginX = 0;
int currBeginY = 0;
int currEndX = 0;
int currEndY = 0;
boolean flag=false;
while (count < arr.length - 1) {
count = findDiagonal(matrix, arr, count, currBeginX, currBeginY, currEndX, currEndY, flag);
flag=!flag;
if(currBeginY<width){
currBeginY++;
}
else if(currBeginY==width){
currBeginX++;
}
if(currEndX<height){
currEndX++;
}
else if(currEndX==height){
currEndY++;
}
}
arr[count]=matrix[height][width];
}
private int findDiagonal(int[][] matrix, int[] arr, int count, int beginX, int beginY, int endX, int endY, boolean flag) {
int currX;
int currY;
if (flag) {
currX = beginX;
currY = beginY;
while (currX <= endX && currY >= endY) {
arr[count] = matrix[currX][currY];
count++;
currX++;
currY--;
}
}
if (!flag) {
currX = endX;
currY = endY;
while (currX >= beginX && currY <= beginY) {
arr[count] = matrix[currX][currY];
count++;
currY++;
currX--;
}
}
return count;
}
}
思路其实比较简单,但自己在边界的思考和处理上还是做得不够,导致leetcode代码提交时出现了几次错误。