牛客网 - 模拟笔试.天弃之子

题目

有一款游戏,过关的方式是按按钮。
游戏一共有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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanlin-hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值