【LeetCode - 1176】健身计划评估

1、题目描述

在这里插入图片描述

2、解题思路

  (下面的天数均为从 0 开始计算,比如第 0 天)

  如果计算每一天所对应的 score ,都得计算包含当天在内往后连续 k 天的卡路里,存在相当的的重复计算。

  比如:calories = [1,2,3,4,5],k = 3

  计算第 0 天时,1+2+3 = 6

  计算第 1 天时,2+3+4 = 9

  这里的 2+3 就是重复计算。

  为了避免重复计算,定义一个累积数组 accumulate[] 来保存累计值。

  比如:accumulate[2] 表示0、1、2 共三天的卡路里累积值;accumulate[3] 表示0、1、2、3 共 4 天的卡路里累计值。

  于是,当我需要计算第 4 天的连续 3 天的卡路里总量,计算的是4、5、6这三天,只需要:accumulate[6] - accumulate[3] 即可.

  1、遍历 calories[] 数组,得到 accumulate[] 数组;

  2、第 0 天的后 k 天卡路里总值为 accumulate[k-1] ,直接获取;第 n 天的后 k 天卡路里总值为 accumulate[n]-accumulate[n-k];

  3、遍历每一天,比较 lower 和 upper 即可。

3、解题代码

class Solution {
    public int dietPlanPerformance(int[] calories, int k, int lower, int upper) {
        int days = calories.length;
        int[] accumulate = new int[days];    // 第一天到第 n 天累计值
        accumulate[0] = calories[0];
        for (int i = 1; i < days; i++) {
            accumulate[i] = accumulate[i - 1] + calories[i];
        }
        int calory;
        int score = 0;
        for (int i = k - 1; i < days; i++) {
            if (i == k - 1) {
                calory = accumulate[i];
            }else {
                calory = accumulate[i]-accumulate[i-k];
            }
            if (calory < lower) {
                score--;
            } else if (calory > upper) {
                score++;
            }
        }
        return score;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值