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() != )
{
//代表列的臨時變量
int col = ;
//1表示第一列不置0
bool isFirstRowZ = ;
for (vector<int>::iterator j = matrix[].begin(); j != matrix[].end(); j++)
{
//第一列置零
if (*j == && isFirstRowZ != )
{
isFirstRowZ = ;
}
}
for (vector<vector<int> >::iterator i = matrix.begin() + ; i != matrix.end(); i++)
{
for (vector<int>::iterator j = i -> begin(); j != i -> end(); j++)
{
//第一列置零
if (*j == && (*i)[] != )
{
(*i)[] = ;
}
//第一行置零
if (*j == && matrix[][col] != )
{
matrix[][col] = ;
}
++col;
}
col = ;
}
//根據第一行将矩陣置0
col = ;
for (vector<int>::iterator j = matrix[].begin() + ; j != matrix[].end(); j++)
{
if (*j == )
{
for (vector<vector<int> >::iterator i = matrix.begin() + ; i != matrix.end(); i++)
{
//列置0
(*i)[col] = ;
}
}
++col;
}
//根據第一列将矩陣置0
for (vector<vector<int> >::iterator i = matrix.begin() + ; i != matrix.end(); i++)
{
//行置0
if( (*i)[] == )
{
for(vector<int>::iterator k = i->begin() + ; k != i->end(); k++ )
{
*k = ;
}
}
}
//處理第一列
if (matrix[][] == )
{
for (vector<vector<int> >::iterator i = matrix.begin() + ; i != matrix.end(); i++ )
{
(*i)[] = ;
}
}
//處理第一行
if (isFirstRowZ == )
{
for (vector<int>::iterator j = matrix[].begin(); j != matrix[].end(); j++)
{
*j = ;
}
}
}
}
};