斜めのトラバース
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]
説明:
説明:
- これ以上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