题目描述
我们现在有n枚硬币,我们需要将硬币进行排列为阶梯状,我们在第一行放置一枚,第二行放置两枚,以此类推,最后将硬币排列为阶梯状
解题思路
①暴力求解
我们可以将每一行数据进行相加,当最后的数据小于或者等于当前行数的时候就说明我们已经到达最后一行了,这个时候只要输出对应的行数就可以了!
②二分查找
我们知道,我们现在有n个硬币,但是一定到不了n行
但是也许可以到达中间行,那是不是我们可以计算中间行数下的硬币数然后让他和我们现在有的硬币数进行比较就可以知道我们下一次寻找的时候往哪里进行寻找,是往前还是往后,这样也就大大缩短了时间复杂度!!
然后我们知道,我们的数据存在一个规律,那就是满足等差数列!
(x^2+x)/2
③牛顿迭代
当我们存在平方根的时候我们就可以使用牛顿迭代求解!!
这里我们有(x^2+x)/2 那么可以进行化简
代码展示
①暴力求解
public static int coinArray(int n){
for(int i=1;i<n;i++){
n=n-i;
if(n<=i){
return i;
}
}
}
②二分查找
public static int coinArrays2(int n){
int low=0,high=n;
while(low<high){
int mid=(high-low)/ 2 +low;
int cost=((mid+1)*mid)/2;
if(cost==n) return mid;
else if(cost>n) high=mid-1;
else low=mid+1;
}
return high;
}
③牛顿迭代
public static int coinArrays(int n){
if(n==0) return 0;
return sqrt(n,n);
}
private double sort(double x,int y){
double res=(x+(2*n-x)/x)/2;
if(res==x) return res;
else return sqrt(res,n);
}
这里的牛顿迭代需要好好的想一想!!!!!
附上最近照片