プログラマー-バルーン爆発
9121 ワード
提问:巴尔恩爆炸
基本内容
コアは、最後まで残すべき球標に基づいて、左、右領域の最小値を求める場合(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;
}
に感銘を与える
皆さんがどう思っているのか本当に知りたいです.
Reference
この問題について(プログラマー-バルーン爆発), 我々は、より多くの情報をここで見つけました https://velog.io/@khw970421/프로그래머스-풍선-터트리기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol