ここでのオリジナルタイトルリンク:https://leetcode.com/problems/diagonal-traverse/
トピック:
以下の図に示すようにN個の要素(M行、N列を)×Mの行列が与えられ、対角順に行列のすべての要素を返します。
例:
入力: [ [1、2、3]、 [4、5、6]、 [7、8、9] ] 出力:[1,2,4,7,5,3,6,8,9] 説明:
注意:
与えられた行列の要素の総数は、10,000を超えません。
ソリューション:
結果のサイズはM * Nであるべきです。
R + Cがあっても、行列のインデックスを右に移動されている各値について。それが右に当たっている場合はyesの場合、最初のチェック下に移動します。はい、右に移動した場合には、アップ当たっている場合は、確認してください。それ以外の場合は右に移動します。
それがダウンして当たっている場合はR + cは、行列のインデックスは、左down.Firstチェックを奇数に移動される場合にはそうならば、右に移動します。それが左に当たっているかどうかをチェックyesの場合その後、下に移動します。それ以外の場合は上下左に移動。
これは、それが最初に動くことになる方向、それはコーナーを打ったときのように考えてください。
時間複雑:O(M * N)。M = matrix.length。N =行列[0] .LENGTH。
スペース:O(1)。かかわらず、resは。
ACのJava:
1 クラスソリューション{ 2 公共 のint [] findDiagonalOrder(INT [] []行列){ 3 であれば(マトリックス== NULL || matrix.length == 0 ||行列[0] .LENGTH == 0 ){ 4 リターン 新しいです INT [0 ]。 5 } 6 7 INT M = matrix.length。 8 INT N =行列[0 ] .LENGTH。 9 INT [] RES = 新しい INT [M * N]。 10 INT R = 0 。 11 INTC = 0 。 12 のために(INT ; I <M * N I ++ iが0 = {) 13の RES [I] = 行列[R] [C]。 14 15 もし((R + C)%2 == 0 ){ 16 であれば(C == N-1 ){ 17 R ++ 。 18 } そう であれば(R == 0 ){ 19 C ++ 。 20 } 他{ 21 r--の。 22 C ++ ; 23 } 24 } 他{ 25 であれば(R == M - 1 ){ 26 C ++ 。 27 } そう であれば(C == 0 ){ 28 R ++ 。 29 } 他{ 30 R ++ 。 31 C-- 。 32 } 33 } 34 } 35の 36 戻りRES。 37 } 38 }
同様のスパイラルマトリックス。