LeetCode 62、63のユニークなパスI + II

カラムは、O(m)に最適化することができるため、ラインスペースは、O(n)で最適化することができます。

クラス解決{
 パブリックINT uniquePaths(INT M、int型N){
         int型 DP [M] [N] = { 0 }。
        DP [ 0 ] [ 0 ] = 1 以下のためにint型 I = 0 ;私がm <; ++ i)が{
             ためINT J = 0 ; J <N; ++ J){
                 場合(私の== 0 && jは== 0続けます
                DP [I] [J] = 0;
                もし(J- 1 > = 0 )DP [I] [J] + = DP [I]、[J- 1 ]。
                もし(I- 1 > = 0 )DP [I] [J] + = DP [I- 1 ] [J]。
            } 
        }            
        戻り DP [M- 1 ] [N- 1 ]。
    } 
}。

そして、前の質問には、のように、ゼロへの障害のような場所に注意を払います。

クラス解決{
 パブリックINT uniquePathsWithObstacles(ベクトル<ベクトル< INT >>&obstacleGrid){
         int型、M = obstacleGrid.size()、N = obstacleGrid [ 0 ] .size()。
        ベクター <ベクトル< INT >> DP(M、ベクトル< INT >(N、0 )); 
        DP [ 0 ] [ 0 ] = obstacleGrid [ 0 ] [ 0 ] == 010 以下のためにint型 i = 0 ; iがmを<; ++ I){
            INT J = 0 ; J <N; ++ J){
                 場合(私の== 0 && jは== 0続けますそう であれば(obstacleGrid [I] [J] == 1)DP [I] [J] = 0 ;
                そう であれば(j == 0)DP [I] [J] = DP [I- 1 ] [J]。
                そう であれば(I == 0)DP [I] [J] = DP [I]、[J- 1 ]。
                 DPは、[I]は[j]はDPを= [I- 1 ] [J] + DP [I]、[J- 1 ]。
            }
        }
        戻り DP [M- 1 ] [N- 1 ]。
    } 
}。

 

一意のパスバリアント - GoogleのHF

左上隅から右上隅に行き、すべてのステップは→つまり、正の右上または右下に行く必要があり↗↘

列DP、DP [I] [J] = DP [I-1] [J-1] + DPに[I]、[J-1] + DP [I + 1] [J-1]は、I-1注、私+ 1はの存在を必要とします

 

followup1:  Oの最適化スペースの複雑さ(N)

あなたは[m]をDP [2]スクロール配列を行うことができます。次にDP [m]は、変数PREV左上の値を記録する必要性に一次元場合。

 

followup2:矩形で3点を考えると、それは、これらの3つのポイントを横断するパスがあるか否かを判定する

ペイントが観察法則を発見することができるようになります。各セルは唯一の3つの方向から行くことができますので、(x、y)は(i、j)のに来ることができるときに、2つの格子(x、y)と(i、j)を、考えるとき、(X、Yセクタ領域)が内部(i、j)のバックシートに配置されます

式Iで表される - Y - DY <= xは、iがDY、DY = Jを+ = <

ソートした後、彼らはグループが存在しない見つけた場合成立していない(今回はソートする方法を考えることができます)

 

followup3:すべてのこれらの三点を見つけるための3つの点、パストラバーサルの数で与えられた矩形

または1フォローアップの線に沿ってスクロールアレイDPを使用しますが、ポイントの列を取得するために、現在の必要がある場合、唯一のポイントDP、他のグリッドは、すべての我々は唯一この列に目標点を通るパスを気にしていることを示す、ゼロに設定

(複数の点が達成される場合、直接リターン0)

 

followup4:下限(I == H)を考えると、境界を設定するために、すべての通過経路の数を見つける(I> = H)

1:まずDPが再び、右上のパスにすべての金額を取得

2:次に、0 <= I '= H、0 <= J <= COLS小さな矩形再び、その後の数の下限なし全てDPパスを得ます

3:2つの最終パスの数を減算して得られた結果

コードは、1のフォローアップを再利用することができます

公共 INT uniquePathsは(int型の列、int型 COLS、INT {H)
     戻り uniquePaths(行、COLS) - uniquePaths(H、COLS)を、
}

 

followup5:すべての可能なパスの数を見つけ、開始と終了が左下に左上から変化し、各工程はできる唯一↓↘↙

行にDP

 

参照

https://www.1point3acres.com/bbs/thread-423857-1-1.html

おすすめ

転載: www.cnblogs.com/hankunyan/p/11479116.html