• 刷题感悟


    最近稍微有点懈怠了 刷题不勤了 勉励下自己

    这道题目挺有意思的 

    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];
  • 相关阅读:
    SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法
    转:SqlServer2012自增列值突然增大1000的原因及解决方法
    sql server 自增列,值突然增大1000的情况
    C# 复制数组容易踩到的坑--引用类型与值类型
    sql中的表值函数与标量值函数区别与用法
    Swift4.0复习循环
    获取视频第一帧图片
    UITableView实现行纵向颜色渐变
    iOS点击按钮第二次不能旋转View
    iOS扩大按钮的点击范围
  • 原文地址:https://www.cnblogs.com/zslzz/p/7355482.html
Copyright © 2020-2023  润新知