description:將乙個矩陣(二維陣列)按對角線向右進行列印。(搜了一下發現好像是美團某次面試要求半小時手撕的題)思路:考慮每條對角線開頭元素的index(i,j)。i從0開始遍歷,j從col-1開始遍歷,首先考慮j的變化,若j變為0,則保持不變,讓i變化。在確定開頭元素後,可通過設定i+1,j+1及不超過範圍來向lst中對角線上新增元素。example:
input:
[[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]output:
[[4],
[3, 3],
[2, 2, 2],
[1, 1, 1],
[5, 5],
[9]]
對於以上例子,各對角線開頭元素的index分別為:
(0,3)
(0,2)
(0,1)
(0,0)
(1,0)
(2,0)
其中各lst中的元素index分別為:
[(0,3)]
[(0,2),(1,3)]
[(0,1),(1,2),(2,3)]
[(0,0),(1,1),(2,2)]
[(1,0),(2,1)]
[(2,0)]
**:
def
diagonal_right
(matrix):if
not matrix:
return
row =
len(matrix)
col =
len(matrix[0]
) col2 = col
result =
for i in
range
(row)
:for j in
range
(col2 -1,
-1,-
1):#j倒序遍歷
lst =
i1,j1 = i,j #i1,j1用於方便同一對角線元素的新增,否則改變i,j影響開頭元素的選擇
while i1 <= row -
1and j1 <= col -1:
[j1]
) j1 +=
1 i1 +=
1if i ==
0and j ==0:
#當遍歷完(0,0)開頭的一條對角線後,讓j固定為0
col2 =
1return
('the result is: %s'
%result,
'end'
)#test
print
(diagonal_right([[
1],[
2]])
)print
(diagonal_right([[
1]])
)print
(diagonal_right([[
1,2,
3,4]
,[5,
1,2,
3],[
9,5,
1,2]]))
輸出:
變型:由(0,0)開始向左列印:
思路:同樣考慮每條對角線開頭元素的index(i,j)。i從0開始遍歷,j也從0開始遍歷,首先考慮j的變化,若j變為col-1,則保持不變,讓i變化。在找到開頭元素後,可通過設定i+1,j-1及不超過範圍來向lst中對角線上新增元素。
對於以上例子,各對角線開頭元素的index分別為:
(0,0)
(0,1)
(0,2)
(0,3)
(1,3)
(2,3)
其中各lst中的元素index分別為:
[(0,0)]
[(0,1),(1,0)]
[(0,2),(1,1),(2,0)]
[(0,3),(1,2),(2,1)]
[(1,3),(2,2)]
[(2,3)]
**:
def
diagonal_left
(matrix):if
not matrix:
return
row =
len(matrix)
col =
len(matrix[0]
) k=
0 result =
for i in
range
(row)
:for j in
range
(k,col)
:# j順序遍歷
lst =
i1, j1 = i, j # i1,j1用於方便同一對角線元素的新增,否則改變i,j影響開頭元素的選擇
while i1 <= row -
1and j1 >=0:
[j1]
) j1 -=
1 i1 +=
1if i==
0and j==col-1:
k=col-
1return
('the result is: %s'
% result,
'end'
)# test
print
(diagonal_left([[
1],[
2]])
)print
(diagonal_left([[
1]])
)print
(diagonal_left([[
1,2,
3,4]
,[5,
1,2,
3],[
9,5,
1,2]]))
輸出:
此問題還可以有多種變型,若從左下角,右下角按對角線列印等,只需要進行簡單的修改即可實現。
矩陣對角線輸出
題1 二維陣列 n n 沿對角線方向,從右上角列印到左下角如n 4 4 4陣列 寫道 要求列印出 寫道 4 3 8 2 7 12 1 6 11 16 5 10 15 9 14 1303 02 13 01 12 23 00 11 22 33 10 21 32 20 31 30程式 public cla...
力扣 1329將矩陣按對角線排序
沒有什麼特別的難度,就是特別樸素的排序。主要是邊界控制 class solution sort buff.begin buff.end for int j 0 j buff.size j for int i 0 i c i sort buff.begin buff.end for int j 0 j...
螺旋矩陣,求對角線之和
線代知識 include intmain void scanf d n a x y 1 while n n c for x 0 x printf n 站在數學角度看 會有重複點,但 執行不會有重複點。因為對於 而言方陣中的元素只遍歷了一次,不會有重複點 include intsum int a 10...