排列硬币

总共有n枚硬币,将它们摆成一个阶梯形状,第k行就必须正好有k枚硬币。

给定一个数字n,找出可形成完整阶梯行的总行数

n是一个非负整数,并且在32位有符号整型的范围内

public class ArrangeCoin {
    public static void main(String[] args) {
        System.out.println(arrangeCoins(10));
    }
    //穷取,迭代
    public static int arrangeCoins(int n){
        for (int i=1;i<=n;i++){
            n=n-i;
            if (n<=i){
                return I;
            }
        }
        return 0;
    }
    //二分查找
    public static int arrangeCoins1(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 0;
    }
    //牛顿迭代
    public static int arrangeCoins2(int n){
        if(n==0){
            return 0;
        }
        return (int)sqrt(n,n);

    }
    public static double sqrt(double i,int x){
        double res = (i+(2*i-x)/i)/2;
        if (res == i){
            return I;
        }else{
            return sqrt(res,x);
        }

    }
}
上一篇:(C++)寻找1-100以内所有素数,复杂度为O(nsqrt(n))与O(nloglogn)的两种方法


下一篇:单细胞copykat分析文献Delineating copy number and clonal substructure中的Freeman Tukey算法