[パス]ホワイトブラシ科目Day28のleetcode739毎日温度(ダブルポインタ暴力、単調スタック)(初期学習が単調スタック)

  • leetcode739気温
毎日の温度のリストによると、リストを再構築し、対応する位置を入力すると、温度がその日の日数を超えて上昇するまで待機する必要がどのくらいです。結局のところ、増加していない場合は、位置を使用してください0を代わりに。

例えば、リスト温度所与 = 73であり747571は69727673である ]は、出力[なければならない11421100 ]。

ヒント:温度範囲リストの長さがある[ 130000 ]。各華氏温度値にされている[ 30100 の範囲の整数] A。

出典:滞在ボタン(LeetCode)
リンク:HTTPS:// leetcode-cn.com/problems/daily-temperatures 
すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
  1. 方法1:ダブルポインタ暴力の最適化

最初のコードのコミット

クラス解決{
 パブリック
    ベクトル < INT > dailyTemperatures(ベクトル< INT >&T){ 
        ベクトル < INT > RES(T.size()、0 );
        もし(T.size()<= 1 戻りRES。
        
        int型 I = 0、J = 1 ;
        INT J = 1!; J = T.size(); ++ J){
             もし(T [j]> T [J- 1 ]){
                 ためのint型 K = J-1 ; K> = I。- K){
                     場合(RES [K] == 0   && T [K] < T [J]){ 
                        RES [k]は J = - kは、
                    } 
                    もし(T [K]> = T [J])
                         ブレーク
                } 
            } 
            もし(!RES [I] = 0 
                I = J。            
        } 

        戻りRESと、
    } 
}。

 

私は戻って、左を示しすることに加えて、pは右バックの導入を示しています。

クラス解決{
 パブリック
    ベクトル < INT > dailyTemperatures(ベクトル< INT >&T){ 
        ベクトル < INT > RES(T.size()、0 );
        もし(T.size()<= 1 戻りRES。
        
        int型私= 0、P = - 1 ;
        INT J = 1 ++!; J = T.size(){j)の
             場合(T [j] <= T [J- 1 ])
                P = J- 1;
            もし(T [j]> T [J- 1 ]){ 
                RES [J - 1 ] = 1 int型、K> = I; K = P - K){
                     場合(RES [K] == 0   && T [K] < T [J]){ 
                        RES [K] = J - kは、
                    } 
                    もし(T [K]> = T [J]){ 
                        P = K。
                        破ります; 
                    } 
                } 
            } 
            もし(RES [i]を=!0 
                I = J;    
        } 
        
        戻りRESと、
    } 
}。

 

 

 

最後に最適化されたコード:(先頭を検出する具体的な例では、結果に影響を与えることなく、省略してもよいです)

クラス解決{
 パブリック
    ベクトル < INT > dailyTemperatures(ベクトル< INT >&T){ 
        ベクトル < INT > RES(T.size())。

        int型私= 0、P = - 1 ;
        INT J = 1 ++; J <T.size(){j)の
             場合(T [j] <= T [J- 1 ])
                P = J- 1 { 
                RES [J - 1 ] = 1;
                int型、K> = I; K = P - K){
                     もし(T [K] <T [J] && RES [K] == 0 ){ 
                        RES [K] = J - kは、
                    } 
                    もし(T [K]> = T [J]){ 
                        P = K。
                        破ります; 
                    } 
                } 
            } 
            もし(!RES [I] = 0 
                I = J。    
        } 
        
        戻りRESと、
    } 
}。

最適化は依然として同じであるが、場合によっては最適化(多数の「76」)を通過しない後暴力は、Oの時間複雑度(N ^ 2)であります

 

  • メソッドの単調スタック(モノトーンスタック)

この質問は非常に古典的な、非常に基本的な単調なスタックの例であります

クラス解決{
 パブリック
    ベクトル < INT > dailyTemperatures(ベクトル< INT >&T){ 
        ベクトル < INT > RES(T.size())。
        スタック < 整数 >   index_stack。
        
        以下のためにint型 iは= 0 ++; iはT.size()< {I)
            一方(index_stack.empty()&& Tを[index_stack.top()] <!T [I]){ 
                (RES [index_stack.topを)] = I - index_stack.top()。
                index_stack.pop(); 
            }
            index_stack.push(I);   
        }    
        戻りRESと、
    } 
}。

要約:

  • この質問は、古典的なタイトルの単調なスタック、基礎問題です
  • 原理と単調スタックに泊まった、非常に強力なデータ構造、シンプルかつエレガントなコードが魅了単調スタックです!

 

おすすめ

転載: www.cnblogs.com/ACStrive/p/11601181.html