题目描述

给你一个大小为 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之对角线遍历(寻找规律)相关推荐

  1. 【498. 对角线遍历】

    来源:力扣(LeetCode) 描述: 给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素. 示例 1: 输入:mat = [[1,2,3],[4, ...

  2. 498 对角线遍历(找规律)

    1. 问题描述: 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [  [ 1, 2, 3 ],  [ ...

  3. [Swift]LeetCode498. 对角线遍历 | Diagonal Traverse

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  4. LeetCode 对角线遍历(找规律)

    一.LeetCode 498 对角线遍历 题目描述: 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 思路: 参考题解 ...

  5. java对角线遍历_Leetcode 498:对角线遍历Diagonal Traverse(python3、java)

    对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. Given a matrix of M x N elemen ...

  6. leetcode练习 对角线遍历(二维数组)

    给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...

  7. 3.对角线遍历(LeetCode第498题)

    一.题目描述 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ...

  8. 力扣498. 对角线遍历

    给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素. 代码思路:以第一行和右边最后一列作为每轮的开始元素,先用temp存储,全部按 从左上到右下 的 ...

  9. 498. 对角线遍历

    498. 对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...

最新文章

  1. 2015湖南省省赛 阶乘除法 暴力
  2. 看完这部缓存进化史,还不懂缓存,请给我差评
  3. java 线程的创建和执行_线程管理(一)线程的创建和运行
  4. tensorflow filter_variables
  5. php中mysqli_query,在PHP中如何使用mysqli_query()函数
  6. 潘石屹接连带货 Python,要来抢我们的饭碗?
  7. 开发过程中的注意事项,想到哪写到哪
  8. linux QT 结束当前进程_Linux桌面进化史
  9. Linux配置本地端口映射
  10. OpenGL着色器程序解析--点光源
  11. latex插入pdf
  12. Netbeans使用问题整理
  13. 硬盘柱面损坏怎么办_硬盘扇区损坏怎么办
  14. shell foreach
  15. 让生活多点儿青春的气息
  16. Gateway网关下载启动
  17. 计算机教师培训内容,(计算机教师培训内容.doc
  18. YOJ3394-挑剔的H胖胖
  19. 内存优化表MOT管理
  20. 如何查询拟投期刊是否为EI收录期刊

热门文章

  1. @程序员,拒绝无聊的代码面试!
  2. 使用Java写出身高预测_何预测孩子身高遗传潜质
  3. 【平面设计基础】09:横幅banner的设计
  4. 安装Red Giant Maxon App时提示错误11025:无法连接到Red Giant服务
  5. 基于微信小程序的奶茶在线预定点单管理系统
  6. Android查询AirPods电量,如何在安卓手机上检查AirPods Pro的电池电量
  7. 基于一段神奇的CSS渐变制作噪点效果
  8. ppt里面的文字如何设置加粗
  9. 东大22春绩效管理X《绩效管理》在线平时作业1资料非答案
  10. wps表格(函数重点)