LeetCode.1716. 计算力扣银行的钱

一、题目

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。
最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。
给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。

示例 1:
输入:n = 4
输出:10
解释:第 4 天后,总额为 1 + 2 + 3 + 4 = 10 。
示例 2:
输入:n = 10
输出:37
解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37 。注意到第二个星期一,Hercy 存入 2 块钱。
示例 3:
输入:n = 20
输出:96
解释:第 20 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 + 4 + 5 + 6 + 7 + 8) = 96 。

提示:
1 <= n <= 1000
通过次数41,460提交次数59,825
来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/calculate-money-in-leetcode-bank
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、代码

思路1:第二周开始,每天的钱比前一周对应天多一块钱

那么可以看成是以第一周为基础,第二周开始,每天的钱在第一周基础上增加1,即

第一周:1~7,

第二周:2~8,

第三周:3~9,

第四周:4~10,

。。。。。

则每日额度 = 基础额度(1~7) + 积累额度(已有周数)

int totalMoney(int n){
    int count = 0;//已有count周 = 积累额度
    int sum = 0;//总额
    for(int i = 1 ; i <= n; i++){//1~n遍历每一天
        int money = i%7 + count;//当天额度=基础额度+积累额度
        if(i % 7 == 0){//判断当日是否为周日,是则周数count+1,即积累额度+1
            //当日为周日,基础额度为7,而i%7=0,所以不能用i%7表示周日的基础额度
            money = 7 + count;//周日 = 基础额度 + 7
            count ++;
        }
        sum += money;
    }
    return sum;
}

时间复杂度:O(n)

空间复杂度:O(1)

思路2:数学方法
参考: https://leetcode.cn/problems/calculate-money-in-leetcode-bank/solution/ji-suan-li-kou-yin-xing-de-qian-by-leetc-xogx/

一周内每天的存取额度是一个等差数列。又由于下一周每天的存取额度比上一周每天多1,所以下一周总额比上一周总额多7,那么,以周为单位,每周的存取额度也是一个等差数列,公差为7。由此我们可以先计算完整周的总额,在计算剩余天数的额度,而剩余天数也是等差数列,公差为1。

int totalMoney(int n){
    //完整周的总金额
    int weekCompleteNum = n/7;
    int firstWeekMoney = (1 + 7)*7/2;
    int weekCompleteMoney = firstWeekMoney*weekCompleteNum + 7*(weekCompleteNum - 1)*weekCompleteNum/2;
    if(weekCompleteNum == 0){
        weekCompleteMoney = 0;
    }
    //剩余天的总金额
    int daysRest = n % 7;
    int dayMon = weekCompleteNum + 1;//剩余天中,第一天必是周一
    //利用等差公式求出剩余天的总金额
    int daysCompleteMoney = dayMon* daysRest + (daysRest - 1)* daysRest/2;
    return weekCompleteMoney + daysCompleteMoney;
}

时间复杂度:O(1)

空间复杂度:O(1)

三、总结

等差公式:

第n项:

前n项和:

性质:

若m+n = p + q,则;

若m+n = 2p,则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值