嗬,力扣银行
1、看题
中规中矩的简单题吧,让我们快速地过。
2、思路
注意一下每日存入的钱的数量即可。
在一周内,每天存入的钱的数量为上一天+1,即week[n][n] = week[n][n-1]
。
而每周的第一天,存入的钱的数量是上一周第一天+1,即week[n][1] = week[n-1][1]
。
简单类比下就会知道,你可以清楚地得知到只要知道当前是第几周,是该周的第几天,你就可以知道当天得到的数量。
而为了省去重复循环的作业,我们可以使用前缀和的思想,把第一周的周几时存入银行的所有数量计算出来,就可以很方便后续的计算了。
直接动手吧
3、开工
class Solution {
public int totalMoney(int n) {
int[] m = new int[8];
//第0天不计数且不使用
m[0] = 0;
//第一天存入1块钱
int inc = 1;
for (int i = 1; i <= 7; i++) {
m[i] = m[i - 1] + inc;
inc++;
}
int total = 0;
int week = 0;
while (n > 7) {
//m[7]为这周日时,存入银行的所有钱
total += m[7];
//每周周一会比上周一+1,故每周或多7
total += 7 * week;
week++;
n -= 7;
}
//不足一周时,取出周几时存入的所有钱,并加上后几周增加的数量
total += m[n] + n * week;
return total;
}
}
4、提交
5、咀嚼
时间复杂度是常量级的,会比O(1) 的耗时高些。
能做到耗时排名100%,纯靠这题计算量太小,难以拉开差距
6、看看大牛
倒是没有大牛贴出我这种解法……
毕竟这题要不就用暴力模拟,要不就直接上数学公式去接了,而我这种属于不伦不类的中等做法。
思考了,但没完全思考
放出官解的好了,模拟和计算两种实现都有。
7、总结
好吧,也没啥想说的,总之大家周末愉快~