演算法 面試 順時針列印矩陣

2021-10-06 21:08:29 字數 4165 閱讀 7472

輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。

示例 1:

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

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

示例 2:

輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

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

限制:0 <= matrix.length <= 100

0 <= matrix[i].length <= 100

要順時針列印,即右->下->左->上->右。。。直到最後乙個元素。

class

solution;}

int m = matrix.length;

int n = matrix[0]

.length;

int[

] result =

newint

[m * n]

;// 先往右,不能再往右就往下,不能往下就往左,不能往左就往上,不能往上就往右

boolean

visited =

newboolean

[m * n]

;// int index = 0;

// 遍歷計數

int k =0;

// 當前方向

int selected =0;

// 右、下、左、上

int[

] direction =

;int i =0;

int j =0;

int index = i * n + j;

while

(i * n + j < result.length &&

!visited[i * n + j]

)else

j++;}

else

if(selected ==1)

else

i++;}

else

if(selected ==2)

else

j--;}

else

if(selected ==3)

else

i--;}

}return result;

}}

4ms

o(n)

o(n)

前面方法中雖然時間複雜度為o(n),但是實際執行時間卻很慢,原因是每趟遍歷都需要大量判斷語句。

其實在每次開始轉換方向後的遍歷,是可以**需要在該方向走幾步的。

比如4*3的矩陣:

從矩陣外向(0,0)開始從左往右走,能走4步,

然後向下走2步,

向左走4-1=3步,

向上走2-1=1步,

向右走2步,

順時針遍歷完畢

可以觀察到,每次走完乙個方向後,下次和該方向平行的方向可走步數為當前可走步數減一。

同時,這樣能**步數的走法,所以就沒有必要記錄某個元素是否訪問過,空間複雜度降為o(1)。

class

solution;}

int m = matrix.length;

int n = matrix[0]

.length;

int[

] result =

newint

[m * n]

;// 先往右,不能再往右就往下,不能往下就往左,不能往左就往上,不能往上就往右

// 遍歷計數

int k =0;

// 當前方向

int selected =0;

int i =0;

int j =0;

int horizontalmove = n;

int horizontalmoverecord = horizontalmove;

int verticalmove = m -1;

int verticalmoverecord = verticalmove;

while

(k < result.length)

j++;}

// 往右移動完畢,開始轉為往下移動

前面分析過,每次轉向後走的步數可**,所以可以再次優化,省去判斷當前方向**。

class

solution;}

int m = matrix.length;

int n = matrix[0]

.length;

horizontalmoverecord = n;

verticalmoverecord = m -1;

movesteps = horizontalmoverecord;

int[

] result =

newint

[m * n]

;// 先往右,不能再往右就往下,不能往下就往左,不能往左就往上,不能往上就往右

horizontalmove(1

,1, result, matrix)

;return result;

}private

void

horizontalmove

(int iincrement,

int jincrement,

int[

] result,

int[

] matrix)

while

(true

) j += jincrement;;}

// 水平移動完畢,開始轉為往下移動

順時針列印矩陣

輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 45 6 7 89 10 11 1213 14 15 16則依次列印出數字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。這個題目 寫的並不好感覺,好多if看著就煩,就是...

順時針列印矩陣

題目 給定乙個矩陣,從外向內順時針列印矩陣中的每乙個數字。例如 給定矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 輸出應該為 分析 這道題的意思非常直觀,給人的感覺也是so easy,然而實際去做的時候會發現,如果結構劃分的不好,會出現很多的迴圈,而且包括對各種...

順時針列印矩陣

from 題目 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次列印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。網上聽說聽到包括autod...