[2021/08/18 KATA NINJA] leet code #2


3sum


solution


値が大きい場合は、kの値を減算します.お見合いの場合、値段は左に行くほど小さくなります.したがって,値を減らすには小さい値を加えなければならないので,kの値を減らす.
値が小さい場合は、jの値を大きくする必要があります.コレクションの場合、値は右に大きいほど大きくなります.したがって,値を大きくするには大きな値を増やさなければならないので,jの値を大きくする.
値が同じ場合は、j値を大きくし、k値を小さくします.いずれかのタスクのみを実行すると、絶対に希望がないという初期化の感覚があります.(k値を減算しても、減算された値を減算しても、同じ場合に減算された値を減算することは絶対に望ましくありません.同様に、jの値を上げても、同じ場合に減算された値を増やすことは絶対に望ましくありません.)
 
    while(i !== nums.length-2){
        if(nums[i] > 0 ){
            break;
        }
        let j=i+1;
        let k=nums.length-1;
        
        while( j < k ){
            if(nums[j] + nums[k] < -1 * nums[i] ){
                j++;
            }else{
                if(nums[j] + nums[k] === -1 * nums[i]){
                    answer[`${nums[i]}${nums[j]},${nums[k]}`] = [nums[i],nums[j],nums[k]];
                    j++;
                    k--;
                    
                }else{
                    k--;
                    
                }
            }
            
        }
        i++;
        

    }    

Wrong case


私の方法は、値が大きくなったり等しくなったりしたときに、iとkの値を初期化することです.△私のiもkも右にインクリメントするポインタです.そのため、比較を必要としない将来性のない場合でも計算に含まれます.これは効率的ではありません.
   while(i !== nums.length-2){
        if(nums[i] > 0 ){
            break;
        }
        let j=i+1;
        let k=j+1;
        
        while(j !== nums.length - 1 ){
          
          
            if(nums[j] + nums[k] < -1 * nums[i] ){
                k++;
            }else{
                if(nums[j] + nums[k] === -1 * nums[i]){
                    answer[`${nums[i]}${nums[j]},${nums[k]}`] = [nums[i],nums[j],nums[k]];
                  
                    j = j+1;
                    k = j+1;
                    
                }else{
                    j = j+1;
                    k = j+1;
                    
                }
            }
            
        }
        i++;
   }

比較


前に2つのポインタを行うのは、可能性が高くなくても検査を行うという意味です.能率が落ちる
前にはポインタがあり、後ろにはポインタがあり、将来性のあるものを優先的に確認することができます.
次は同じ場合の回数比較です.

学識


一つ固定したら、二つの針を両端に置いて計算します.

ダエストラ


リンク