一、题目
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,则