最近稍微有点懈怠了 刷题不勤了 勉励下自己
这道题目挺有意思的
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];
时间: 2024-10-19 11:09:18