天天看點

leetcode-Set Matrix Zeroesleetcode-矩陣置零

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 = ;
                }
            }
        }
    }
};