刷題感悟 - 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];
刷題感悟 - Guess Number Game II