文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
498. 对角线遍历 - 力扣(LeetCode)
2. 题目大意
描述:给定一个大小为 m×n 的矩阵 mat 。
要求:以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
说明:
- m==mat.length。
- n==mat[i].length。
- 1≤m,n≤104。
- 1≤m×n≤104。
- −105≤mat[i][j]≤105。
3. 示例
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
4. 解题思路
找规律:
- 「行号 + 列号」为偶数时,方向为从左下到右上。记右上方向 (−1,+1),即行号减 1,列号加 1。
- 「行号 + 列号」为奇数时,方向为从右上到左下。记左下方向 (+1,−1),即行号加 1,列号减 1。
边界情况:
- 向右上方向移动时:
- 如果在最后一列,则向下方移动,即
**x += 1**
。 - 如果在第一行,则向右方移动,即
**y += 1**
。 - 其余情况想右上方向移动,即
**x -= 1**
、**y += 1**
。
- 如果在最后一列,则向下方移动,即
- 向左下方向移动时:
- 如果在最后一行,则向右方移动,即
**y += 1**
。 - 如果在第一列,则向下方移动,即
**x += 1**
。 - 其余情况向左下方向移动,即
**x += 1**
、**y -= 1**
。
- 如果在最后一行,则向右方移动,即
5. 参考代码
class Solution {public int[] findDiagonalOrder(int[][] mat) {int rows = mat.length;int cols = mat[0].length;int count = rows * cols;int x = 0, y = 0;int[] ans = new int[rows*cols];for (int i = 0; i < count; i++) {ans[i] = mat[x][y];if ((x + y) % 2 == 0) {// 最后一列if (y == cols - 1) {x++;// 第一行} else if (x == 0) {y++;// 右上方向} else {x--;y++;}} else {// 最后一行if (x == rows - 1) {y++;// 第一列} else if (y == 0) {x++;// 左下方向} else {x++;y--;}}}return ans;}}