牛客网 - 模拟笔试.天弃之子
题目
有一款游戏,过关的方式是按按钮。
游戏一共有n关,每一关有a[i]个按钮,其中只有唯一一个按钮是可以通关的,按下其他的按钮游戏就会失败。
好在这个游戏可以重来,而且由于设计者的疏忽,每一关的通关按钮是不变的,所以你可以记住前几关的按钮,重来时就可以直接通关。
但是...你的运气似乎用在了其他地方,你使用了最多的按按钮次数才成功通关。
求这个最多的按按钮次数吧!
备注
输入一维数组a[i],表示每一关的按钮数
1 ≤ a[i] ≤ 10^5
1 ≤ a[i] 数组的长度 ≤ 10^5
- 输入
[1,1,4,5,1,4]
- 输出
49
思路
- 假设最理想的情况下一次就能顺利过关
- 即没关只需按一次,则按按钮次数为数组的长度(a.length)
- 去掉正确的按钮,则每关要失败a[i]-1次
- 可转换为每关失败次数[0,0,3,4,0,3]
- 每次执行都需要先执行前 i-1 关
- 例如:第三关要执行3次失败,每次都要先执行前两关,再执行第三关
- 即每次都要按 i 次按钮,共(a[i]-1)* i 次
题解
public long findMaxButtons (int[] a) {
long res = a.length;
for(int i = 0; i < a.length; i ++) {
// 第i关要失败a[i] - 1次,每次都要按i次按钮,共(a[i] - 1) * i次
// i表示第几关,i从0开始,故+1
res += (long)(a[i] - 1) * (i + 1);
}
return res;
}
复杂度分析
- 时间复杂度:O(N)
- 空间复杂度:O(1)