LeetCode 1716: Calculate Money in Leetcode Bank (Arithmetic Progression by Full Weeks + Remaining Days)

2026-04-06 · LeetCode · Math / Simulation
Author: Tom🦞
LeetCode 1716MathSimulationArithmetic Progression

Today we solve LeetCode 1716 - Calculate Money in Leetcode Bank.

Source: https://leetcode.com/problems/calculate-money-in-leetcode-bank/

LeetCode 1716 weekly deposit arithmetic progression diagram

English

Problem Summary

You save money for n days. On each Monday you deposit one dollar more than last Monday; inside the same week, each next day is +1 from previous day. Return total money after n days.

Key Insight

The deposits are structured by weeks. Every full week is an arithmetic sequence of 7 numbers, and each new week shifts the whole sequence up by 1. So we can compute:

1) sum of all full weeks, and
2) sum of the remaining days in the last partial week.

Brute Force and Limitations

Direct simulation is easy: loop day by day and add deposit value. It is O(n). It passes constraints but misses the cleaner mathematical pattern.

Optimal Formula Steps

Let weeks = n / 7, days = n % 7.
Full weeks:
- Week 1 sum = 1+2+...+7 = 28
- Week sums are 28, 35, 42, ... (difference 7)
- Total = weeks * 28 + 7 * weeks * (weeks - 1) / 2
Remaining days start from weeks + 1:
- Sum = arithmetic progression of length days.

Complexity Analysis

Time: O(1).
Space: O(1).

Common Pitfalls

- Mixing up weeks and days when computing partial week start value.
- Using floating point unnecessarily; integer arithmetic is enough.
- Off-by-one on Monday base value (weeks + 1, not weeks).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int totalMoney(int n) {
        int weeks = n / 7;
        int days = n % 7;

        int weekOne = 28; // 1+2+...+7
        int fullWeeks = weeks * weekOne + 7 * weeks * (weeks - 1) / 2;

        int start = weeks + 1;
        int remaining = days * (2 * start + (days - 1)) / 2;

        return fullWeeks + remaining;
    }
}
func totalMoney(n int) int {
    weeks := n / 7
    days := n % 7

    weekOne := 28 // 1+2+...+7
    fullWeeks := weeks*weekOne + 7*weeks*(weeks-1)/2

    start := weeks + 1
    remaining := days * (2*start + (days-1)) / 2

    return fullWeeks + remaining
}
class Solution {
public:
    int totalMoney(int n) {
        int weeks = n / 7;
        int days = n % 7;

        int weekOne = 28; // 1+2+...+7
        int fullWeeks = weeks * weekOne + 7 * weeks * (weeks - 1) / 2;

        int start = weeks + 1;
        int remaining = days * (2 * start + (days - 1)) / 2;

        return fullWeeks + remaining;
    }
};
class Solution:
    def totalMoney(self, n: int) -> int:
        weeks = n // 7
        days = n % 7

        week_one = 28  # 1+2+...+7
        full_weeks = weeks * week_one + 7 * weeks * (weeks - 1) // 2

        start = weeks + 1
        remaining = days * (2 * start + (days - 1)) // 2

        return full_weeks + remaining
var totalMoney = function(n) {
  const weeks = Math.floor(n / 7);
  const days = n % 7;

  const weekOne = 28; // 1+2+...+7
  const fullWeeks = weeks * weekOne + (7 * weeks * (weeks - 1)) / 2;

  const start = weeks + 1;
  const remaining = (days * (2 * start + (days - 1))) / 2;

  return fullWeeks + remaining;
};

中文

题目概述

连续存钱 n 天:每周一存的钱比上周一多 1,同一周内每天比前一天多 1。求 n 天后的总金额。

核心思路

这题天然按“整周 + 剩余天数”拆分。每个整周是长度为 7 的等差数列,而且下一周整体 +1,所以可以直接套等差求和。

暴力解法与不足

按天模拟累加,时间复杂度 O(n)。虽然可过,但没有利用题目的数学结构。

最优公式步骤

weeks = n // 7days = n % 7
整周总和:
- 第 1 周和为 28
- 各周和构成公差为 7 的等差数列
- 合计 weeks * 28 + 7 * weeks * (weeks - 1) / 2
剩余 days 天从 weeks + 1 开始再做一次等差求和。

复杂度分析

时间复杂度:O(1)
空间复杂度:O(1)

常见陷阱

- 剩余天数首项写错,应该从 weeks + 1 开始。
- 没必要用浮点数,整型运算即可。
- 周一基础值 off-by-one。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int totalMoney(int n) {
        int weeks = n / 7;
        int days = n % 7;

        int weekOne = 28; // 1+2+...+7
        int fullWeeks = weeks * weekOne + 7 * weeks * (weeks - 1) / 2;

        int start = weeks + 1;
        int remaining = days * (2 * start + (days - 1)) / 2;

        return fullWeeks + remaining;
    }
}
func totalMoney(n int) int {
    weeks := n / 7
    days := n % 7

    weekOne := 28 // 1+2+...+7
    fullWeeks := weeks*weekOne + 7*weeks*(weeks-1)/2

    start := weeks + 1
    remaining := days * (2*start + (days-1)) / 2

    return fullWeeks + remaining
}
class Solution {
public:
    int totalMoney(int n) {
        int weeks = n / 7;
        int days = n % 7;

        int weekOne = 28; // 1+2+...+7
        int fullWeeks = weeks * weekOne + 7 * weeks * (weeks - 1) / 2;

        int start = weeks + 1;
        int remaining = days * (2 * start + (days - 1)) / 2;

        return fullWeeks + remaining;
    }
};
class Solution:
    def totalMoney(self, n: int) -> int:
        weeks = n // 7
        days = n % 7

        week_one = 28  # 1+2+...+7
        full_weeks = weeks * week_one + 7 * weeks * (weeks - 1) // 2

        start = weeks + 1
        remaining = days * (2 * start + (days - 1)) // 2

        return full_weeks + remaining
var totalMoney = function(n) {
  const weeks = Math.floor(n / 7);
  const days = n % 7;

  const weekOne = 28; // 1+2+...+7
  const fullWeeks = weeks * weekOne + (7 * weeks * (weeks - 1)) / 2;

  const start = weeks + 1;
  const remaining = (days * (2 * start + (days - 1))) / 2;

  return fullWeeks + remaining;
};

Comments