給定乙個mxn矩陣,如果矩陣中有元素0,則將其所在的行和列都置為0。請使用原地演算法。原題鏈結
例如:輸入:[
[1,1,1],
[1,0,1],
[1,1,1]
]輸出:[
[1,0,1],
[0,0,0],
[1,0,1]
]設定兩個長度分別為m和n的標記陣列分別記錄行和列是否有0,根據標記陣列將某些矩陣元素置0。
class
solution
:def
setzeroes
(self, matrix)
:"""
:type matrix: list[list[int]]
:rtype: void do not return anything, modify matrix in-place instead.
"""m =
len(matrix)
if m ==0:
return
n =len(matrix[0]
)if n ==0:
return
row =
[false
]* m
col =
[false
]* n
for i in
range
(m):
for j in
range
(n):
if matrix[i]
[j]==0:
row[i]
=true
col[j]
=true
for i in
range
(m):
if row[i]
:for j in
range
(n):
matrix[i]
[j]=
0for j in
range
(n):
if col[j]
:for i in
range
(m):
matrix[i]
[j]=
0return
首先記錄第1行和第1列是否需要置0,這裡需要兩個常數空間來標記,然後用第1行和第1列作為標記陣列的空間,來對除第1行和第1列之外的行和列進行記錄。最後根據記錄將某些矩陣元素置0。
class
solution
(object):
defsetzeroes
(self, matrix)
:"""
:type matrix: list[list[int]]
:rtype: void do not return anything, modify matrix in-place instead.
"""m =
len(matrix)
if m ==0:
return matrix
n =len(matrix[0]
)if n ==0:
return matrix
flag_row =
false
flag_column =
false
#記錄第1行和第1列是否置0
for i in
range
(n):
if matrix[0]
[i]==0:
flag_row =
true
break
for j in
range
(m):
if matrix[j][0
]==0:
flag_column =
true
break
#用第1行和第1列記錄其他行和列是否置0
for i in
range(1
, m)
:for j in
range(1
, n)
:if matrix[i]
[j]==0:
matrix[0]
[j]=
0 matrix[i][0
]=0#改變其他行和列的值
for i in
range(1
, m)
:for j in
range(1
, n)
:if matrix[0]
[j]==
0or matrix[i][0
]==0:
matrix[i]
[j]=
0#改變第一行和第一列的值
if flag_row:
for j in
range
(n):
matrix[0]
[j]=
0if flag_column:
for i in
range
(m):
matrix[i][0
]=0
微軟俱樂部程式設計題第一周第二題 矩形覆蓋
我們可以用2x1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2x1的小矩形無重疊地覆蓋乙個2xn的大矩形,總共有多少種方法?我們先把2xn的覆蓋方法記為f n 用第乙個1x2小矩陣覆蓋大矩形的最左邊時有兩個選擇,豎著放或者橫著放。當豎著放的時候,右邊還剩下2x n 1 的區域,這種情況下的覆蓋方...
微軟俱樂部程式設計題第二週第三題 刪除鍊錶中重複的結點
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 刪除重複結點,只需要記錄當前結點前的最晚訪問過的不重複結點ppre 當前結點pcur 指向當前結點後面的結點pnext的三個指標即可。如果當前節...
第二章程式設計題
庫函式標頭檔案包含 include include include 函式狀態碼定義 define true 1 define false 0 define ok 1 define error 0 define infeasible 1 define overflow 2 typedef int st...