https://leetcode-cn.com/problems/set-matrix-zeroes/
回答:
両方の方法は、時間計算量はO(MN)であります
O(M + N)スペース方法:
0二つの容器で行と列として格納され
クラス解決{ パブリック: ボイド setZeroes(ベクトル<ベクトル< INT >>&行列){ // O(M + N)额外空间、常数空间??? セット < 整数 > RSE、CSE。 INT R = matrix.size()。INT C =行列[ 0 ] .size()。 以下のために(INT iが= 0 ; I <Rを、I ++ ){ ため(INT J = 0 ; J <C; J ++ ){ 場合(行列[I] [J] == 0 ){ rse.insert(I)。 cse.insert(J)。 } } } ながら(!{rse.empty())、 int型温度= * rse.begin()。 用(int型 J = 0 ; J <C; J ++ ){ 行列[TEMP] [j] = 0 ; } rse.erase(rse.begin())。 } ながら(!{cse.empty())、 int型温度= * cse.begin()。 以下のために(INT iが= 0 ; I <Rを、I ++ ){ 行列[I] [TEMP] = 0 ; } cse.erase(cse.begin())。 } } }。
一定の空間方法:
最初の行0、列0用のデータ0の場合は、フラグisrow =真、iscol = TRUEが記録され、0です。
m行および列のデータ1〜1〜nが0であれば、それは、行0、列0でマークされている、すなわち
I:1〜M- 1 J: 1〜N- 1 であれば(行列[I] [J] == 0 ) 行列[I] [ 0 ] = 0、行列[ 0 ] [j] = 0 ;
C ++コード:
クラス解決{ パブリック: ボイド setZeroes(ベクトル<ベクトル< INT >>&行列){ // 一定の空間ソリューション // フラグ0行0番目の列が0かどうかである。 BOOL IsRow = falseに、 BOOL iscol = falseに、 INT = R&LT matrix.size(); int型 C =行列[ 0 ] .size(); のための(INT J = 0 ; J <C; J ++ ){ IF(行列[ 0 ] [J] == 0 ){ IsRow =trueに、BREAK ; } } のための(INT I = 0 ; I <R&LT; I ++ ){ IF(行列[I] [ 0 ] == 0 ){ iscol = trueに、BREAK ; } } // フラグ欄は1〜N ;結果は、第0行0番目の列に配置され、0である ため(INT I = 1 ; I <R&LT; I ++ ){ ため(INT J = 1。 ; J <C; J ++ ){ IF(行列[I] [ J] ==0 ){ 行列[I] [ 0 ] = 0 ; 行列[ 0 ] [J] = 0 ; } } } // 最初の選択肢は、1〜n個の値をランク付け するための(INT I = 1 ; I <R&LT; I ++ ) { IF(行列[I] [ 0 ] == 0 ){ ため(INT J = 0 ; J <C; J ++ ){ 行列[I] [J] = 0 ; } } } のための(int型、J = 1、J <C; J ++ ){ 場合(行列[ 0 ] [j] == 0 ){ ため(INT iは= 0 ; I <R、I ++ ){ 行列[I] [J] = 0 ; } } } // 再替换0行和0列 場合(isrow){ ための(int型 J = 0 ; J <C; J ++ ){ 行列[ 0 ] [j] = 0 ; } } もし{(iscol) のための(INTは iが= 0を I ++; I <R {) 行列[I] [ 0 ] = 0 ; } } } }。