-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10_28_2024.js
99 lines (77 loc) · 2.45 KB
/
10_28_2024.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
* Forward declaration of guess API.
* @param {number} num your guess
* @return -1 if num is higher than the picked number
* 1 if num is lower than the picked number
* otherwise return 0
* var guess = function(num) {}
*/
/**
* @param {number} n
* @return {number}
Binary search problem!!!
*/
var guessNumber = function(n, maxNum) {
if (!maxNum) {
maxNum = n;
n = Math.floor(n/2.0);
}
console.log(`Checking num: ${n}, maxNum ${maxNum}`)
let currentGuessResult = guess(n)
if (currentGuessResult == 0) return n;
if (n == 0) return 1;
if (currentGuessResult == -1) {
// search lower
let lowerMidNum = Math.floor(n/2.0);
return guessNumber(lowerMidNum, n);
} else if (currentGuessResult == 1) {
//search higher
let higherMidNum = Math.ceil((maxNum - n)/2.0) + n;
return guessNumber(higherMidNum, maxNum);
}
};
/**
* @param {number} n
* @return {number}
*/
var getMoneyAmount = function(guessNum, maxNum, runningSum = 0) {
// base case
if (maxNum && guessNum == maxNum) {
return runningSum;
} else if (guessNum == 1) {
return runningSum;
}
if (!maxNum) maxNum = guessNum;
runningSum += guessNum
console.log(`Checking guessNum ${guessNum}, with max: ${maxNum}, runningSum: ${runningSum}`)
let nextLowerNumber = Math.ceil(guessNum/2.0);
let nextHigherNumber = guessNum + (Math.ceil((maxNum - guessNum)/2.0))
let lowerSum = getMoneyAmount(nextLowerNumber, guessNum, runningSum)
let higherSum = getMoneyAmount(nextHigherNumber, maxNum, runningSum)
return Math.min(lowerSum, higherSum)
};
//
/**
* @param {number} n
* @return {number}
* better dynamic programming option
*/
var getMoneyAmount = function(n) {
let dp = Array(n + 1).fill(0).map(() => Array(n + 1).fill(0));
function calculateCost(start, end) {
if (start >= end) {
return 0;
}
if (dp[start][end] !== 0) {
return dp[start][end];
}
let minCost = Infinity;
for (let guess = Math.floor((start + end) / 2); guess <= end; guess++) {
let cost = guess + Math.max(calculateCost(start, guess - 1), calculateCost(guess + 1, end));
minCost = Math.min(minCost, cost);
}
dp[start][end] = minCost;
return minCost;
}
return calculateCost(1, n);
};