Leetcode 498:対角線トラバース斜めトラバース(のpython3、Java(登録商標))

斜めのトラバース

M×N個の要素がマトリックス(M行、N列)が含まれて考えると、すべての要素が行列の対角走査順序に戻り、対角線トラバース以下に示すように。
。M×N個のマトリックスが与えられる以下の画像に示すように、要素(M行、N列)、対角順に行列のすべての要素を返す
例:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出:  [1,2,4,7,5,3,6,8,9]

説明:
ここに画像を挿入説明

説明:

  1. これ以上100,000に与えられた行列における要素の総数。

アイデア

二次元アレイの範囲の例は、入力0~2であります

まず見た目トラバーサルルール:(0,0) - >(0,1) - >(1,0) - >(2,0) - >(1,1) - >(0,2) - >( 2) - >(2,1) - >(2,2)

配列インデックス(M、N)、2つの変更実施形態1、(M-1、N + 1)2、(M + 1、N-1)

アレイ(0,0)から最初、開始(M-1、N + 1)、(0,0) - >( - 1,1)の場合はm = -1、範囲外、M 0が割り当てられます。次いで方法にインデックスを変更するスイッチ(M + 1、N-1)、実行する2つ(0,1) - >(1,0) - >(2、-1)、N 0は再び、(2,0)を得るために割り当てられていますスイッチングモード指数(M-1、N + 1)を変更して、次の(2,0)までの範囲の外である - >(1,1) - >(0,2) - >( - 1,3)。この点m <0かつn> 2(M + 2、N-1)、範囲外であり、n(M + 2、N-1)の実装、優先順位が範囲外であるか否かの判定が行われる時 - >(1,2)、回避しますメートル以来、<0は再び道のインデックスを変更するスイッチ。その後、通常のハンドオーバー:(1,2) - >(2,1) - >(3,0)、M> 2、及びスイッチングモード(M-1、N + 2)のため

Javaの

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length==0||matrix[0].length==0)return new int[0];
        int col=matrix.length,row=matrix[0].length;
        int nums=col*row,m=0,n=0;
        int res[]=new int[nums];
        boolean flag=true;

        for(int i=0;i<nums;i++){
            res[i]=matrix[m][n];
            if(flag){
                n+=1; m-=1;
            }else{
                n-=1; m+=1;
            }
            if(m>=col){
                m-=1; n+=2; flag=true;
            }else if(n>=row){
                n-=1; m+=2; flag=false;
            }
            if(m<0){
                m=0; flag=false;
            }else if(n<0){
                n=0; flag=true;
            }
        }
        return res;
    }
}

注意点:

if (matrix.length==0||matrix[0].length==0)return new int[0];最初の空の配列、追加のかどうかが決定されるmatrix.length==0||matrix[0].length==0場合ので配列決意条件は、逆にすることができないmatrix.length==0後者はmatrix[0].length==0決定されない、すなわち、空の配列を返す。しかし、matrix[0].length==0入力配列が空の場合、フロントが、場合matrix[0]について説明ない行列インデックス0ため。

なお、nは、それぞれの最大長さ以上である場合、実行、M用の第1ループに(M-1、N + 2)、(M + 2、N-1)が決定されます。Mを避け、nは、同時に2個以上のフラグブール値ゼロ誤差。

パイソン:

class Solution:
    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
        if(len(matrix)==0 or len(matrix[0])==0):
            return []
        col=len(matrix)
        row=len(matrix[0])
        nums=col*row
        m=n=0
        flag=True
        res=[]
        for i in range(nums):
            res.append(matrix[m][n])
            if flag:
                m-=1
                n+=1
            else:
                m+=1
                n-=1
            if m>=col:
                m-=1
                n+=2
                flag=True
            elif n>=row:
                m+=2
                n-=1
                flag=False
            if m<0:
                m=0
                flag=False
            elif n<0:
                n=0
                flag=True
        return res

ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/10979358.html