輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。
示例 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...