筆記試験アルゴリズムの王ハンマーボーナス問題(JS)
3314 ワード
筆記試験のアルゴリズムの王のハンマーはボーナスの問題を出します
需要
考え方1
JS実現構想一
function calcBonus(peopleArr) {
var resultArr = [];
var n = peopleArr.length
for (let i = 0; i < n; i++) {
resultArr[i] = 100;
}
for (let i = 1; i < n; i++) {
if (peopleArr[i] > peopleArr[i - 1]) {
resultArr[i] = resultArr[i - 1] + 100;
}
}
for (let i = n - 1; i > -1; i--) {
// ,
if (peopleArr[i - 1] > peopleArr[i] && resultArr[i - 1] < resultArr[i] + 100) {
resultArr[i - 1] = resultArr[i] + 100;
}
}
var result = 0;
for (let i = 0; i < n; i++) {
result += resultArr[i]
}
return result;
}
// :
var peopleArr1 = [9, 6, 3]
calcBonus(peopleArr1) //300, 200, 100 => 600
var peopleArr2 = [1, 4, 5, 9, 3, 2]
calcBonus(peopleArr2)// 100, 200, 300, 400, 200, 100 => 1300
時間的複雑度はO(N),空間的複雑度はO(N)である.
考え方2
一度だけ遍歴して、最終的に必要なボーナスと:
よりよく理解するには、次の2つのテスト例を参照してください.
var peopleArr3 = [1, 5, 4, 2, 3, 1] // 100, 300, 200, 100, 200, 100 => 1000
var peopleArr4 = [1, 2, 3, 4, 5, 3, 2, 1] // 100, 200, 300, 400, 500, 300, 200, 100 => 2100
PS:計算を容易にするため、単位値を1にすれば、最後のresult*100でよい.
JS実現構想二
function calcBonus2(peopleArr) {
var result = 1;
var n = peopleArr.length;
var curMax = 1;
var count = 0;
for(let i = 1; i < n; i++) {
if(peopleArr[i] >= peopleArr[i - 1]){
if(count){
accCount();
}
curMax = peopleArr[i] == peopleArr[i - 1] ? 1 : curMax + 1
result += curMax
}else {
++count
}
}
if(count) {
accCount();
}
function accCount() {
result += count * (count + 1) / 2;
if(count >= curMax){
result += count - curMax + 1;
count = 0;
curMax = 1;
}
}
return result * 100;
}
calcBonus2(peopleArr3); // 1000
calcBonus2(peopleArr4); // 2100
時間複雑度O(n),空間複雑度O(1)