498. Diagonal Traverse

Description

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.

Example:

Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,4,7,5,3,6,8,9]
Explanation:

image

Note:

  1. The total number of elements of the given matrix will not exceed 10,000.

Solution

Enum index sum, O(mn), S(mn)

利用规律:对于每条对角线来说,所有节点的i + j都相等。
所以可以枚举sum = i + j,然后一条一条打印即可。

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        
        List<Integer> list = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        for (int sum = 0; sum <= m + n - 2; ++sum) { // enum sum of rowIndex and colIndex
            List<Integer> diagonal = new ArrayList<>();
            
            for (int i = 0; i <= Math.min(m - 1, sum); ++i) {
                if (sum - i < n) {
                    diagonal.add(matrix[i][sum - i]);
                }
            }
            
            if (sum % 2 == 0) { // reverse if needed
                Collections.reverse(diagonal);
            }
            list.addAll(diagonal);
        }
        
        return list.stream().mapToInt(i->i).toArray();
    }
}

Enum index sum, O(mn), S(1)

基于上面的算法,可以省略掉list,直接向int[] res中写。

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        
        int m = matrix.length;
        int n = matrix[0].length;
        int[] res = new int[m * n];
        int count = 0;
        
        for (int sum = 0; sum <= m + n - 2; ++sum) { // enum sum of rowIndex and colIndex
            if (sum % 2 != 0) {
                for (int i = 0; i <= Math.min(m - 1, sum); ++i) {
                    if (sum - i < n) {
                        res[count++] = matrix[i][sum - i];
                    }
                }
            } else {    // reverse
                for (int i = Math.min(m - 1, sum); i >= 0; --i) {
                    if (sum - i < n) {
                        res[count++] = matrix[i][sum - i];
                    }
                }
            }
        }
        
        return res;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、打开wtoolex文件夹,找到wpsnotify.exe文件,直接新建一个文件,然后改成它的名字,把原文件删掉...
    小掃阅读 4,400评论 0 0
  • 今天,我们单位和诸多兄弟单位一起迎接了省健康教育促进检查团初评工作。 半年多,尤其是近期五周的时间段里,我终于能够...
    像话读书爻阅读 3,093评论 2 7
  • 我向天边挥一挥手, 星星们也似乎回应着, 在目光中他们融成了标点, 在你的字里行间闪现。 风儿柔柔得, 却也吹下了...
    不管清寒阅读 1,855评论 0 2
  • 秋来了,恍然惊觉时,入秋已深。 一池残荷惹人心惊,早开晚落的红荷有几朵依然妖娆,可是,眼前早已掩不住败落的模样。 ...
    心若芷兰阅读 4,731评论 29 38
  • 姓名:丁秋红 所在公司:宁波绿之品电器科技有限公司 组别: 340期【反省一组】学员 一【知~学习】 1、朗诵《六...
    丁小博阅读 2,490评论 0 0

友情链接更多精彩内容