題目描述:
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地
演算法。示例 1:
輸入:示例 2:[ [1,1,1],
[1,0,1],
[1,1,1]
]輸出:
[ [1,0,1],
[0,0,0],
[1,0,1]
]
輸入:高階:[ [0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]輸出:
[ [0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
題幹分析:
本題要求依舊比較簡單,最粗暴的做法是將陣列遍歷,遇到0時將對應的行和列進行標記(這裡不要用0標記,否則會判斷失誤);我們做進一步思考,發現並不需要反覆對陣列內所有元素進行標記,實際上我們只需要行和列的標記,至此解題思路就很明朗了;
思路分析:
我們需要新兩個的陣列來存放標記,標記最好選用bool型別,這樣輕鬆寫意,其實這裡的做法就是高階中的空間o(m+n);常數空間的做法應該如何完成?我的思路是借用陣列空間的第一行和第一列,但這裡會在標記後置零時給你帶來新的問題,你需要先判斷除去行列首尾的三個點,然後將行列首尾三個點單獨拿出來判斷,可以採用標記單獨標記:
如果不將此三點單獨拿出來討論,會嚴重影響整個置零過程,可以結合思考一下;
下圖為空間o(m+n)因未選取此類方法,固將示意圖貼出來
到這裡剩下的事情就是簡單的遞迴迴圈了,其實了解思路後本題還是很簡單的;
**如下:(因為lett_code中很多**比我寫的更加規範,固多有借鑑,侵刪)
void setzeroes(int** matrix, int matrixrowsize, int matrixcolsize) /*if*/else if (matrix[i][j] == 0) //else if
}//for-2
}//for-1
for (i = 1; i < matrixrowsize; ++i) //for-2
}//for-1
for (i = 0; firstcolzero && i < matrixrowsize; ++i) //&&為短路判定,所以在這裡不用擔心多餘的判定
for (j = 0; firstrowzero && j < matrixcolsize; ++j) return ;//void函式建議各位也寫一下return,個人習慣問題
}
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...
leetcode73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 空間複雜度為o mn 的解法自不用多說,直接新建乙個和matrix等大小的矩陣,然後一行一行的掃,只...
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...