题目描述
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
解题思路
理解题目并不难,可以将存入的钱视作一个二维矩阵,暴力解法循环遍历求和即可;也可以直接使用等差数列来求解,这样时间复杂度和空间复杂度都优于暴力解法。
等差数列公式:
a
n
=
a
1
+
d
∗
(
n
−
1
)
a_n = a_1 + d*(n - 1)
an=a1+d∗(n−1)
S n = ( a 1 + a n ) ∗ n 2 S_n = \frac{(a_1 + a_n) * n}{2} Sn=2(a1+an)∗n
之后的代码只需要使用这两个公式。
代码
JavaScript
/**
* @param {number} n
* @return {number}
*/
var totalMoney = function(n) {
// 完整周数
let weekAmount = parseInt(n / 7);
// 最后一周的天数
let dayAmount = n % 7;
// 第一周存入的钱
let firstWeekMoney = (1 + 7) * 7 / 2;
// 最后一个完整周存入的钱
let lastWeekMoney = firstWeekMoney + 7 * (weekAmount - 1);
// 完整周存入钱的总数
let weekMoney = (firstWeekMoney + lastWeekMoney) * weekAmount / 2;
// 最后一周的第一天存入的钱
let firstDayMoney = weekAmount + 1;
// 最后一周的最后一天存入的钱
let lastDayMoney = weekAmount + dayAmount;
// 最后一周存入钱的总数
let dayMoney = (firstDayMoney + lastDayMoney) * dayAmount / 2;
return weekMoney + dayMoney;
};