leetcode-Set Matrix Zeroes

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;
                }
            }
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章