leetcode[Arranging Coins]

来源:互联网 发布:access vba编程入门 编辑:程序博客网 时间:2024/06/15 02:46

解法一:

public class Solution {    public int arrangeCoins(int n) {        //利用求和公式1+2+3+...+k=k*(k+1)/2,    //令k*(k+1)/2 = n,利用一元二次方程的求根公式,因为k大于0,解得:k=(sqrt(8*n+1)-1)/2,取地板    //但是有一个问题,当n很大时,8*n会溢出,8.0*n就变成double了,不会溢出    double temp = Math.floor((Math.sqrt(8.0*n + 1) - 1) / 2);    return (int)temp;    }}

解法一另一种处理方式:

public class Solution {    public int arrangeCoins(int n) {        //利用求和公式1+2+3+...+k=k*(k+1)/2,    //令k*(k+1)/2 = n,利用一元二次方程的求根公式,因为k大于0,解得:k=(sqrt(8*n+1)-1)/2,取地板    //但是有一个问题,当n很大时,8*n会溢出,将n转换为long也不会溢出    double temp = Math.floor((Math.sqrt(8.0 * (long)n + 1) - 1) / 2);    return (int)temp;    }}

解法二:

public class Solution {//利用求和公式1+2+3+...+k=k*(k+1)/2,//因为k*(k+1)/2 <= n,所以可以利用二分检索通过判断找出满足条件的kpublic int arrangeCoins(int n) {int start = 0;int end = n;int mid = 0;while (start <= end){//二分检索的套路mid = (start + end) >>> 1;//相当于(start + end) / 2//这里通过0.5*mid,转化为double了,所以不会有溢出的问题产生if ((0.5 * mid * mid + 0.5 * mid ) <= n){start = mid + 1;}else{end = mid - 1;}}return start - 1;}}