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.
374比较简单,就是一个二分搜索
public class Solution extends GuessGame {
public int guessNumber(int n) {
int low = 1;
int high = n;
int mid = 0;
while(low <= high){
mid = low + (high - low)/2;
int res = guess(mid);
if(res==0){
return mid;
}else if(res>0){
low = mid+1;
}else{
high = mid-1;
}
}
return low;
}
}
375二分搜索不一定是最好的结果,所以不能采用二分搜索来求。
采用动态规划
dp[i][j]表示从i~j中的最少花费
对于 x 属于i~j,如果是x,那么花费为x + max(dp[i][x-1], dp[x+1][j])
在最小化这个花费即为dp[i][j]
public class Solution {
public int getMoneyAmount(int n) {
if(n < 2) return 0;
int[][] dp = new int[n+1][n+1];
return helper(dp, 1, n);
}
public int helper(int[][] dp, int l, int h){
if(l >= h) return 0;
if(dp[l][h]!=0) return dp[l][h];
int res = Integer.MAX_VALUE;
for(int i=l; i <=h; i++){
int t = i + Math.max(helper(dp, l, i-1), helper(dp, i+1, h));
res = Math.min(res, t);
}
dp[l][h] = res;
return res;
}
}