ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

0498. Diagonal Traverse (M)

2020-12-25 22:32:13  阅读:207  来源: 互联网

标签:Traverse 0498 matrix int Diagonal start ans nextX nextY


Diagonal Traverse (M)

题目

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:

Note:

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


题意

按照对角线方向遍历矩阵。

思路

可以按照图示路线进行模拟,或者直接每次都按照右上到左下的顺序遍历,并把奇数次的遍历翻转过来:


代码实现

Java

模拟

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }

        int m = matrix.length, n = matrix[0].length;
        int[] ans = new int[m * n];
        int x = 0, y = 0;
        int xStep = -1, yStep = 1;

        for (int i = 0; i < m * n; i++) {
            ans[i] = matrix[x][y];
            int nextX = x + xStep, nextY = y + yStep;

            if (nextX == -1 && nextY == n) {
              	// 当前在右上角,且要继续向右上走
                x = x + 1;
            } else if (nextX == -1 || nextY == n) {
              	// 当前在上边界或右边界,且要继续向右上走
                x = nextX == -1 ? x : x + 1;
                y = nextY == n ? y : y + 1;
            } else if (nextX == m && nextY == -1) {
              	// 当前在左下角,且要继续向左下走
                y = y + 1;
            } else if (nextX == m || nextY == -1) {
              	// 当前在左边界或下边界,且要继续向左下走
                x = nextX == m ? x : x + 1;
                y = nextY == -1 ? y : y + 1;
            } else {
                x = nextX;
                y = nextY;
            }

            if (nextX == -1 || nextY == -1 || nextX == m || nextY == n) {
                xStep = -xStep;
                yStep = -yStep;
            }
        }

        return ans;
    }
}

翻转

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }

        int m = matrix.length, n = matrix[0].length;
        int[] ans = new int[m * n];
        int index = 0;

        for (int i = 0; i < m + n - 1; i++) {
            int x = i < n ? 0 : i - n + 1, y = i < n ? i : n - 1;
            int start = index;
            while (x < m && y >= 0) {
                ans[index++] = matrix[x++][y--];
            }
            if (i % 2 == 0) {
                reverse(ans, start, index - 1);
            }
        }

        return ans;
    }

    private void reverse(int[] A, int start, int end) {
        while (start < end) {
            int tmp = A[start];
            A[start++] = A[end];
            A[end--] = tmp;
        }
    }
}

标签:Traverse,0498,matrix,int,Diagonal,start,ans,nextX,nextY
来源: https://www.cnblogs.com/mapoos/p/14191015.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有