leetcode打卡Day1

441 排列硬币(难度:简单)

答案一:当时下意识反应想到的答案

很简单,直接循环每次需要的硬币数,一直到硬币不够为止,快三个月没写过代码,好陌生的感觉 :( 。

class Solution {
public:
    int arrangeCoins(int n) {
        int i=1;
        for(int n_temp = n; n_temp>=i; i++){
            n_temp -= i;
        }
        return i-1;
    }
};

 答案二:数列规律

随着硬币行数上涨,硬币总数应该为 1,3,6,10,15....,即 a_{n}=\left (a_{n-2} +a_{n-1} \right ) ,发现之后就去复习高中数学找规律了,规律为i(i+1)/2,忽略了较大数据下int内存不够,导致错误。后面改得时候类型转换又是一顿错,啥都忘了,枯了。

class Solution {
public:
    int arrangeCoins(int n) {
        long i;
        long j;
        for(i=1,j=0;j<=(long)n;i++){
            j = i*(i+1)/2;
        }
        return (int)i-2;
    }
};

 答案三:数学求解方程,题解区找到的答案

即解方程 x(x+1)/2 = n 的解,舍弃负数解,最终结果为\frac{\sqrt{8n+1}-1}{2},结果向下取整。C++怎么开根号临时百度了。没注意int内存不够的问题,又被报了两次错。

class Solution {
public:
    int arrangeCoins(int n) {
        int i = (sqrt(8*(long)n+1)-1)/2;
        return i;
    }
};

 答案四:二分查找(这熟悉又陌生的算法名字)

有n个硬币的情况下,最少1行,最多n行(n==1)时。(在评论区找到了用移位代替除2,我怎么就全忘了呢)

class Solution {
public:
    int arrangeCoins(int n) {
        long left = 1;
        long right = n;
        long mid;
        while( right-left>1 ){
            mid = (left+right)>>1;
            if((mid*(mid+1))/2 == (long)n)
                return (int)mid;
            else if((mid*(mid+1))/2 < (long)n)
                left = mid;
            else
                right = mid;
        }
        return (right * (right + 1) == (long) 2 * n) ? (int) right : (int) left;
    }
};

 一道题做了好久,感觉这个打卡坚持不了几天了,随缘吧,不强求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值