プログラマー-バルーン爆発


提问:巴尔恩爆炸


基本内容


コアは、最後まで残すべき球標に基づいて、左、右領域の最小値を求める場合(leftmin、rightmin).
爆発する球標の値は2つの最小値を超えてはいけません.
一度は小さな風船を爆発させることができるので、爆発させたい風船
左、右は最小値の1つより大きくてもよいが、2つより大きい場合は保持できない.
Only one max=大数は1つしか許可されていません
最小値を左から右に更新して配列を入れ、右から左まで同じにします.
最後に、2つの最小値より大きいかどうかを確認します.だからO(3 n)の方法です
そして,2つの最小値のうちの最大値より小さくするだけでO(n)に減少する.

初志


最初から並べ替えを繰り返し,値に準じて左右に並べ替え,それらの最小値と値を比較して計算する.
function solution(a) {
    var answer = a.length;
    for(let i=0;i<a.length;i++)
        {
            let front =[];
            let back = [];
            front = a.slice(0,i);
            back = a.slice(i+1,a.length);

            if(Math.min.apply(null,front) <a[i] && Math.min.apply(null,back) <a[i]){
                answer--;
            }
        }
    return answer;
}
タイムアウト、実行時に何でも経験した...

問題の情報


O(n)を作成するには、右端と左端の値から開始します.
値がない場合は、2つの値のうち、大きな値を基準にして、左の最小値が右の最小値、右の最小値が左の最小値、または右の最小値より大きい値を見つけることは不可能です.
ex)
5、10、8がある場合、左側が5右側が8、5<8であり、8から左に1格、10が少なくとも右側の最小値8より大きく、左の最小値5より大きいため、存在することは不可能である.
ex)
10、18、2があれば、左側が10右側が2、10<2なので、10から右側に1マス目を歩くと、18は少なくとも右側の最小値2より大きく、左の最小値10より大きいので、存在するはずがない.

質問に基づいて作成された回答コード

function solution(a) {
    let val = 0;
   let answer = a.length;
   let leftMin = a[0],rightMin = a[a.length-1];
    let leftIndex = 0, rightIndex = a.length-1;
    while(1){
        if(val === a.length-2)				//왼쪽 오른쪽 맨끝을 제외한 횟수반복
            break;
        if(leftMin < rightMin){				//왼쪽min보다 오른쪽min이 클때 
            if( a[--rightIndex] < rightMin  ) 		//오른쪽에서 찾은 값이 오른쪽 최소값보다 작다면 최소값을 갱신
                rightMin = a[rightIndex];
            else 					//오른쪽에서 찾은 값이 오른쪽 최소값보다 크다면 왼쪽 최소값보다도 크므로 최후까지 남길 수 없는 풍선이므로 값을 줄인다.
                answer--;
        }
        else{						//오른쪽min보다 왼쪽min이 크다면
           if(leftMin > a[++leftIndex])		//왼쪽에서 찾은 값이 왼쪽 최소값보다 작다면 최소값을 갱신
                leftMin = a[leftIndex];
            else					//왼쪽에서 찾은 값이 왼쪽 최소값보다 크다면 오른쪽 최소값보다도 크므로 최후까지 남길 수 없는 풍선이므로 값을 줄인다.
                answer--;
        }
        val++;
    }
    return answer;
}

に感銘を与える


皆さんがどう思っているのか本当に知りたいです.