アルゴリズムは毎日の練習に質問します---79日目:行列のゼロ化

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して14日目です。クリックしてイベントの詳細をご覧ください

1.問題の説明

m x n 行列 が与えられ、 要素が0の場合、その行と列のすべての要素を 0に設定します 。インプレースアルゴリズムを使用してください 。

トピックリンク:マトリックスゼロ化

第二に、主題の要件

例1

2.png

输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]
复制代码

例2

3.png

输入: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
复制代码

訪問

1.数组
2.建议用时15~25min
复制代码

3.問題分析

これは、配列思考の論理を調べる質問です。最初に特定の配列に対して、ループ判定が最初に実行されます。

位置に0が含まれている場合、この位置を記録するには、どのレコードが使用されますか?

2つのアレイを別々に構築できます

vector<int>row(m),col(n);//行、列数组
复制代码

この行と列全体のデータである0の位置を格納します。

最後に、現在の要素が配置されている行と列をトラバースしますrow[i]或者col[j]。1に等しいことがわかった場合は、要素を0に設定します。

第四に、エンコーディングの実装

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int i,j,p=0,m=matrix.size(),n=matrix[0].size();//初始化数据
        vector<int>row(m),col(n);//行、列数组
        for(i=0;i<m;i++)//遍历求解位置
        {
            for(j=0;j<n;j++)
            {
                if(matrix[i][j]==0)
                {
                    row[i]=col[j]=1;//暂存行、列
                }
            }
        }
        for(i=0;i<m;i++)//之前记录位置的行、列置为0
        {
            for(j=0;j<n;j++)
            {
                if(row[i]||col[j])
                {
                    matrix[i][j]=0;
                }
            }
        }
    }
};

复制代码

5.テスト結果

4.png

1.png

おすすめ

転載: juejin.im/post/7086405420687818783