374. Guess Number Higher or Lower
We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number is higher or lower.
You call a pre-defined API guess(int num) which returns 3 possible results (-1, 1, or 0):
-1 : My number is lower 1 : My number is higher 0 : Congrats! You got it!
Example:
n = 10, I pick 6. Return 6.
标准二分查找
// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);
class Solution {
public:
int guessNumber(int n)
{
int start = 1, end = n;
while (start + 1 < end)
{
int mid = (end - start) / 2 + start;
int k = guess(mid);
if (k == 0)
return mid;
else if (k == -1)
end = mid;
else
start = mid;
}
return (guess(start) == 0) ? start : end; //double check
}
};375. Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number I picked is higher or lower.
However, when you guess a particular number x, and you guess wrong, you pay $x. You win the game when you guess the number I picked.
Example:
n = 10, I pick 8. First round: You guess 5, I tell you that it's higher. You pay $5. Second round: You guess 7, I tell you that it's higher. You pay $7. Third round: You guess 9, I tell you that it's lower. You pay $9. Game over. 8 is the number I picked. You end up paying $5 + $7 + $9 = $21.
Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.
1、使用记忆化搜索,保存已经遍历过的 段。2、开始将ret = min(ret, i + max(helper(start, i - 1), helper(i + 1, end)));写成了ret = min(ret, i + helper(start, i - 1) + helper(i + 1, end));非常不应该。
这个题在选了 i 之后,就只会往一边发展,所以就找花销大的那边就够了。
class Solution {
public:
int getMoneyAmount(int n)
{
count = vector<vector<int>> (n + 1, vector<int> (n + 1, -1));
return helper(1, n);
}
private:
vector<vector<int>> count;
int helper(int start, int end) //helper代表在[start, end]中保证能找到一个值的 最小代价
{
if (start > end) return 0;
if (count[start][end] != -1) //说明已经记忆化搜索过这一段
return count[start][end];
else if (start == end)
{
count[start][end] = 0;
return 0;
}
else
{
int ret = INT_MAX;
for (int i = start; i <= end; i++)
{
// i(当前代价) + 往后面选的最大代价(可能往左或者是右)
ret = min(ret, i + max(helper(start, i - 1), helper(i + 1, end)));
}
count[start][end] = ret;
return ret;
}
}
};
int main( )
{
return 0;
}
458

被折叠的 条评论
为什么被折叠?



