LeetCode498之对角线遍历(寻找规律)
题目描述
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
-105 <= mat[i][j] <= 105
解题思路
解法一
1.思路:
把下标和相同的放到同一个链表,然后反转和为偶数的链表。
2.优缺点:
不需要判断方向,不需要模拟,不需要判断边界,不需要推导公式。此方法可以很容易在面试的时候写出来。
缺点是使用了额外空间。
3.举例:
3.1 第一步:对于每个和,添加对应数字到链表
[0] -> [1]
[1] -> [2,4]
[2] -> [3,5,7]
[3] -> [6,8]
[4] -> [9]
3.2 第二步,反转
[0] -> [1]
[1] -> [2,4]
[2] -> [7,5,3]
[3] -> [6,8]
[4] -> [9]
3.3 输出
解法二
定义四个方向,每一步都判段是否越界,越界的话就掉头。需要定义如下关键变量
int m = mat.length;
int n = mat[0].length;
int result[] = new int[m * n];
int i = 0, j = 0;
int dirct[][] = new int[][] { { 0, 1 }, { 1, -1 }, { 1, 0 }, { -1, 1 } };
boolean forword = true;
boolean change = false;
result[0] = mat[0][0];
代码实现
解法一
/**
Ideas:
We just consider the sum of index (i,j).
Add each element of sum to map, and then we need to reverse list.Time: O(M*N)
Space O(M*N)*/
class Solution {public int[] findDiagonalOrder(int[][] mat) {if(mat == null || mat.length == 0) {return new int[0];}int rows = mat.length;int cols = mat[0].length;int[] res = new int[rows*cols];HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();// add element to mapfor(int i = 0;i < rows;i++) {for(int j = 0;j < cols;j++) {int sum = i+j;if(!map.containsKey(sum)) {map.put(sum, new ArrayList<>());}map.get(sum).add(mat[i][j]);}}// add to resint idx = 0;for(Map.Entry<Integer, ArrayList<Integer>> entry: map.entrySet()) {int sum = entry.getKey();ArrayList<Integer> list = entry.getValue();if(sum % 2 == 0) {// need to reverseCollections.reverse(list);}// add to resfor(int i = 0;i < list.size();i++,idx++) {res[idx] = list.get(i);}}return res;}
}
解法二
public int[] findDiagonalOrder(int[][] mat) {int m = mat.length;int n = mat[0].length;int result[] = new int[m * n];int i = 0, j = 0;int dirct[][] = new int[][] { { 0, 1 }, { 1, -1 }, { 1, 0 }, { -1, 1 } };boolean forword = true;boolean change = false;result[0] = mat[0][0];for (int k = 1; k < m * n; k++) {//从左下到右上对接线的遍历if (forword) {int newi = i + dirct[3][0];int newj = j + dirct[3][1];change = false;//越界了要改变方向,同时"转弯",优先考虑往(0,1)方向移动if (outRange(newi, newj, m, n)) {newi = i + dirct[0][0];newj = j + dirct[0][1];change = true;//存在另一种"转弯"可能if (outRange(newi, newj, m, n)) {newi = i + dirct[2][0];newj = j + dirct[2][1];}}i = newi;j = newj;}//从左下到左对接线的遍历if (!forword) {int newi = i + dirct[1][0];int newj = j + dirct[1][1];change = false;//越界了要改变方向,同时"转弯",优先考虑往(1,0)方向移动if (outRange(newi, newj, m, n)) {newi = i + dirct[2][0];newj = j + dirct[2][1];change = true;if (outRange(newi, newj, m, n)) {newi = i + dirct[0][0];newj = j + dirct[0][1];}}i = newi;j = newj;}if (change) {forword = !forword;}result[k] = mat[i][j];}return result;}private boolean outRange(int i, int j, int m, int n) {if (i < 0 || i > m - 1 || j < 0 || j > n - 1) {return true;}return false;}
解题总结
寻找规律,建议自己不看题解从头到尾实现一遍,不同的人写的会有差异。
LeetCode498之对角线遍历(寻找规律)相关推荐
- 【498. 对角线遍历】
来源:力扣(LeetCode) 描述: 给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素. 示例 1: 输入:mat = [[1,2,3],[4, ...
- 498 对角线遍历(找规律)
1. 问题描述: 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...
- [Swift]LeetCode498. 对角线遍历 | Diagonal Traverse
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- LeetCode 对角线遍历(找规律)
一.LeetCode 498 对角线遍历 题目描述: 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 思路: 参考题解 ...
- java对角线遍历_Leetcode 498:对角线遍历Diagonal Traverse(python3、java)
对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. Given a matrix of M x N elemen ...
- leetcode练习 对角线遍历(二维数组)
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...
- 3.对角线遍历(LeetCode第498题)
一.题目描述 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ...
- 力扣498. 对角线遍历
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素. 代码思路:以第一行和右边最后一列作为每轮的开始元素,先用temp存储,全部按 从左上到右下 的 ...
- 498. 对角线遍历
498. 对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...
最新文章
- 2015湖南省省赛 阶乘除法 暴力
- 看完这部缓存进化史,还不懂缓存,请给我差评
- java 线程的创建和执行_线程管理(一)线程的创建和运行
- tensorflow filter_variables
- php中mysqli_query,在PHP中如何使用mysqli_query()函数
- 潘石屹接连带货 Python,要来抢我们的饭碗?
- 开发过程中的注意事项,想到哪写到哪
- linux QT 结束当前进程_Linux桌面进化史
- Linux配置本地端口映射
- OpenGL着色器程序解析--点光源
- latex插入pdf
- Netbeans使用问题整理
- 硬盘柱面损坏怎么办_硬盘扇区损坏怎么办
- shell foreach
- 让生活多点儿青春的气息
- Gateway网关下载启动
- 计算机教师培训内容,(计算机教师培训内容.doc
- YOJ3394-挑剔的H胖胖
- 内存优化表MOT管理
- 如何查询拟投期刊是否为EI收录期刊