引入
本題可見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代碼提交時出現了幾次錯誤。