跳至主要內容

1716. 计算力扣银行的钱


1716. 计算力扣银行的钱

🟢   🔖  数学  🔗 力扣open in new window LeetCodeopen in new window

题目

Hercy wants to save money for his first car. He puts money in the Leetcode bank every day.

He starts by putting in $1 on Monday, the first day. Every day from Tuesday to Sunday, he will put in $1 more than the day before. On every subsequent Monday, he will put in $1 more than the previous Monday.

Given n, return the total amount of money he will have in the Leetcode bank at the end of thenth day.

Example 1:

Input: n = 4

Output: 10

Explanation: After the 4th day, the total is 1 + 2 + 3 + 4 = 10.

Example 2:

Input: n = 10

Output: 37

Explanation: After the 10th day, the total is (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37. Notice that on the 2nd Monday, Hercy only puts in $2.

Example 3:

Input: n = 20

Output: 96

Explanation: After the 20th day, the total is (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 + 4 + 5 + 6 + 7 + 8) = 96.

Constraints:

  • 1 <= n <= 1000

题目大意

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

解题思路

通过公式直接计算,可以将 n 天分为完整的周数和剩余天数分别计算。

  • 完整周数

    • 完整的 weeks 周内,每周固定的 1 到 7 的存款总和为:28 * weeks(首项为 28)。
    • 每周递增 1 元 的部分:(7 * (weeks - 1) * weeks) / 2
    • 累计存款公式为:28 * weeks + 7 * (weeks - 1) * weeks / 2
  • 剩余天数

    • 对于 rest 天,起始存款金额为 weeks + 1,每天递增 1
    • 累计存款公式为:weeks * rest + (rest + 1) * rest / 2

复杂度分析

  • 时间复杂度O(1),所有计算均为常数时间操作。
  • 空间复杂度O(1),无需额外空间。

代码

/**
 * @param {number} n
 * @return {number}
 */
var totalMoney = function (n) {
	const weeks = Math.floor(n / 7); // 完整周数
	const rest = n % 7; // 剩余天数

	// 计算总存款
	return (
		28 * weeks + // 每周固定的 1 到 7 的存款总和
		(7 * (weeks - 1) * weeks) / 2 + // 每周递增的部分
		((rest + 1) * rest) / 2 + // 剩余天数的基础部分
		weeks * rest // 剩余天数递增的部分
	);
};

相关题目

题号标题题解标签难度力扣
2591将钱分给最多的儿童贪心 数学🟢🀄️open in new window 🔗open in new window