LeetCode二維陣列對角線遍歷

2021-10-04 00:09:24 字數 1592 閱讀 9331

之前刷leetcode都是直接進題庫刷題,今天點開探索才發現還有這種模組化的入門教程,就開啟陣列與字串那塊開始學習。到二維陣列的時候,有一道練習題是這樣的:

給定乙個含有 m x n 個元素的矩陣(m 行,n 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。

樣例輸入:

[[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]

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

之前沒有做過二維陣列的題,上來一下就給我搞蒙了,後來仔細想想,這道題其實難點就在於遍歷方向的判定和邊界點的處理

首先,對於遍歷方向,我將其分為兩類:左下和右上。在**中設定乙個標誌位flag,就可以分別來對這兩種情況進行處理。

其次,對於邊界點的處理。先判斷當前點是否是二維矩陣的最後乙個點(即右下角),如果是,則遍歷結束。對於遍歷方向為右上的,先判定矩形的右邊界,因為這個邊界上的點的下乙個遍歷點只能是它正下方的那個點(已經排除了右下角的結束點),並在遍歷下乙個點的時候遍歷方向改變。然後再判定是否是矩形的上邊界,在排除了右邊界的情況下,上邊界的點的下乙個遍歷點只能是它正右方的那個點,並在遍歷下乙個點的時候遍歷方向改變。不在這兩個邊界上的點的下乙個遍歷點均為它右上方的那個點。對於遍歷方向為左下的,先判定矩形的下邊界,因為在下邊界上的點的下乙個遍歷點只能是它正右方的那個點,並在遍歷下乙個點的時候遍歷方向改變。再判定矩形的左邊界,因為在左邊界上的點的下乙個遍歷點只能是它正下方的那個點,並在遍歷下乙個點的時候遍歷方向改變。

這樣一來,整個**的邏輯就非常清晰了,**如下:

class

solution;}

//如果是空陣列直接返回乙個空陣列

int m=matrix.length,n=matrix[0]

.length;

int[

] ans=

newint

[m*n]

;//新建陣列,大小為二維陣列元素個數

int flag=

0,a=

0,b=0;

//flag是標誌位,0代表右上,1代表左下。a、b是當前遍歷點的行列座標,a為行,b為列

for(

int i=

0;i)//遍歷到了最後乙個點,就退出迴圈

if(flag==0)

else

if(a==0)

else

}else

else

if(b==0)

else}}

return ans;

}}

這道題可能算是一道基礎題,但是對於初學者來說,可以培養一種解決問題的思路。把乙個看起來複雜的問題劃分為幾個步驟,將大問題劃分為小問題,邏輯思路一下就清楚了。

對角線列印二維陣列問題

最近在網上看到這樣一道面試題 二維陣列 n n 沿對角線方向,從右上角列印到左下角如n 4 4 4二維陣列 列印順序 4 3 8 2 7 12 1 6 11 16 5 10 15 9 14 13 網上已經有各種解法,也有現成的程式,但是個人都不是很滿意,網路上的思路都不是很清晰。現在提供一種分析思路...

二維陣列主對角線與次對角線輸出 C語言

二維陣列主對角線與次對角線輸出 include include define n intmain putchar 10 printf 主對角線輸出 n 第一種方法 for int i 0 i 4 i 第二種方法 for int i 0 i 4 i printf 2d n arr i j 第三種方法 ...

矩陣二維陣列的對角線和

題目 求二維陣列方陣每行,每列,對角線元素之和。題解 注釋 include include int main 輸入ctrl z結束迴圈 int size 定義乙個變數用來確定矩陣的行列數!while scanf d size eof int array null 定義乙個二級指標,指向空。int i...