刷题感悟 - Guess Number Game 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.

 

自己踩了两下坑 

坑1:首先没有考虑到大数的权重  以为是最少次数为最优 因此将其作为简单的二分查找来进行 

错误代码如下:

        // int sum=0;
        // int m = (int) (n)/2;
        // while(n-m>1){
        //     sum=sum+m;
        //     m=(int)(n+m)/2;
        // }
        // return sum;

简单除暴的反了错误 。而后反思对代码改进踩到了第二个坑

坑2:过于关注大数的权重,解决思路为:将n个数按照和分成几乎相等的两部分 然后取小数部分来进行不断的叠加

   问题所在 :无法证明小数部分最终结果一定会大于大数部分 。因此该思路部分结果错误

错误代码如下:

  //     if(n==1)return 0;
    //     if(n==2)return 1;
    //     if(n==3)return 2;
    //  int m=selectm(n,1);
    //  int sum=m;
    //  while(n-m>0){
    //      if(n-m==1)m=selectm(m,1);
    //      else
    //      m=selectm(n,m);
    //      sum=sum+m;
    //  }
    //  return sum;
    // }
    // public int selectm(int n,int m){
    //  int sum = (n-m+1)*(n+m)/2;
    //  int count=0;
    //  for(;m<n;m++){
    //      count = count+m;
    //      if(count*2>=sum){
    //          return m;}
    //  }
    //  return m;

经过反思查找相关质料后发现 其实这道题就是一个典型的Floyd算法 从1-2距离开始不断的二分 选取值与原有的数据比较 得到较小值。

注意点:

1.传入的值是n 数组的大小最好未n+1 X n+1

2.从什么时候开始迭代 起始位置当从2-1开始 3-2,3-1,4-3,4-2,4-1,如此顺序进行。

3.当两个位置相邻时 大小当为较小数。

代码如下:

public int selectn(int n){
    int[][] p = new int[n+1][n+1];
    for(int i=2;i<n+1;i++){
        for(int j=i-1;j>0;j--){
            int globalmin=10000;
            for(int k=j+1;k<i;k++){
                int leftsum = (p[j][k-1]>p[k+1][i])?p[j][k-1]:p[k+1][i];
                int sum = k+leftsum;
                globalmin=(globalmin>sum)?sum:globalmin;
            }
            p[j][i]=(j+1==i)?j:globalmin;
        }
    }
    return p[1][n];

 

posted @ 2017-08-13 23:28  小哈是只笨青蛙  阅读(485)  评论(0编辑  收藏  举报