(1) 暴力迭代
思路:放了一行后,看剩下的硬币够放下一行不
//解法1 暴力迭代
public static int CoinSort(int num){
for (int i = 1; i <= num; i++) {
num=num-i;
if (num <= i){
return i;
}
}
return 0;
}
(2)二分法
上面的迭代时间复杂度为On,用二分法的话,只要OlogN而已.
思路:上面迭代是按硬币个数来迭代的,实际上我们的硬币数一定小于实际行数的。
//解法2 思路
public static int binarySortCoin(int n){
int low=0,high=n-1;
while (low<=high){
int mid=low+(high-low)/2;
//使用等差数列求和公式计算从第一行到第mid行的硬币和
int total=mid*(mid+1)/2;
if (n==total){
return mid;
}else if (total > n){
high=mid-1;
}else {
low=mid+1;
}
}
return high;
}