leetcode-矩陣置零
之前趨勢科技面試的時候遇到的題目:
給定一個m*n的矩陣,將含有0的元素的對應行和列都置0
注意點:
- 本題的時間複雜度很難降低,因爲矩陣必須要遍歷一遍,所以時間複雜度是O(mn)
- 可以考慮空間複雜度的降低,即用最少的存儲空間實現題意
- 參考了一些其他人的思路,覺得降低空間複雜度的最好方法就是把遇到的每一個0都放到其對應的行的第一列,以及其列的第一行(也就是把所有要置的0都放到矩陣的第一行的第一列)。這樣做的好處是節省空間,並且不會影響後續的遍歷置0的過程,因爲0對應的行的第一列和列的第一行都是已經遍歷過的了
易錯點:
-是在遇到0的時候不能馬上把對應的行和列置0,否則在後續遍歷中會分不清是之前矩陣的0還是後續放置的0
我錯的地方:
- 沒有在原來的矩陣上進行數據操作導致了沒有改變原矩陣的值(C++中指針和引用可以改變原來變量的值)
- 在寫一個遍歷語句的時候犯了一個邏輯錯誤,導致只有在滿足條件的時候才執行本來必須執行的語句
題目代碼如下:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.empty() != 1)
{
//代表列的臨時變量
int col = 0;
//1表示第一列不置0
bool isFirstRowZ = 1;
for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++)
{
//第一列置零
if (*j == 0 && isFirstRowZ != 0)
{
isFirstRowZ = 0;
}
}
for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
{
for (vector<int>::iterator j = i -> begin(); j != i -> end(); j++)
{
//第一列置零
if (*j == 0 && (*i)[0] != 0)
{
(*i)[0] = 0;
}
//第一行置零
if (*j == 0 && matrix[0][col] != 0)
{
matrix[0][col] = 0;
}
++col;
}
col = 0;
}
//根據第一行將矩陣置0
col = 1;
for (vector<int>::iterator j = matrix[0].begin() + 1; j != matrix[0].end(); j++)
{
if (*j == 0)
{
for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
{
//列置0
(*i)[col] = 0;
}
}
++col;
}
//根據第一列將矩陣置0
for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
{
//行置0
if( (*i)[0] == 0)
{
for(vector<int>::iterator k = i->begin() + 1; k != i->end(); k++ )
{
*k = 0;
}
}
}
//處理第一列
if (matrix[0][0] == 0)
{
for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++ )
{
(*i)[0] = 0;
}
}
//處理第一行
if (isFirstRowZ == 0)
{
for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++)
{
*j = 0;
}
}
}
}
};