美文网首页
leetcode 374+375--guess

leetcode 374+375--guess

作者: Ariana不会哭 | 来源:发表于2018-12-22 00:27 被阅读0次

    leetcode 374

    图片.png

    这道题很简单,但我在写的时候还是二分法出错:

    • 注意
      为了防止死循环+溢出,我们选用int mid=left + (right - left) / 2;
      最后返回左或者右都可以:
    int guessNumber(int n) {
            if(guess(n)==0)
                return n;
            int left=1,right=n;
            while(left<right){
                int mid=left + (right - left) / 2;
                int ans=guess(mid);
                if(ans==0)
                    return mid;
                if(ans==1)
                    left=mid;
                else
                    right=mid;
            }
            return left;
        }
    

    leetcode 375

    图片.png
    • 例子:
      n=1: 最小只能是1
      n=2:最小只能是1
      n=3:有1 2 3 :如果猜1,错误的情况 最小是1+2;所以最小只能是2
      n=4:有1 2 3 4:分情况讨论:

    当k为1时,左区间为空,所以cost为0,而右区间2,3,4,根据之前的分析应该取3,所以整个cost就是1+3=4。

    当k为2时,左区间为1,cost为0,右区间为3,4,cost为3,整个cost就是2+3=5。

    当k为3时,左区间为1,2,cost为1,右区间为4,cost为0,整个cost就是3+1=4。

    当k为4时,左区间1,2,3,cost为2,右区间为空,cost为0,整个cost就是4+2=6。

    综上k的所有情况,此时我们应该取整体cost最小的,即4,为最后的答案

    
    int helper(int start,int end,vector<vector<int>>& dp){
            if (start >= end) 
                return 0;
            int ans=INT_MAX;
            if(dp[start][end]>0)
                return dp[start][end];
                
            for(int i=start;i <=end;i++){
                int money=i+max(helper(start,i-1,dp),helper((i+1),end,dp));
                ans=min(ans,money);
            }
            dp[start][end]=ans;
            return dp[start][end];
        }
        int getMoneyAmount(int n) {
            vector<vector<int>> dp(n+1,vector<int>(n+1,0));
            return helper(1,n,dp);
        }
    

    相关文章

      网友评论

          本文标题:leetcode 374+375--guess

          本文链接:https://www.haomeiwen.com/subject/ssubkqtx.html