1176. 健身计划评估

1176. 健身计划评估 #

  • 标签:数组、滑动窗口
  • 难度:简单

题目大意 #

好友给自己制定了一份健身计划。想请你帮他评估一下这份计划是否合理。

给定一个数组 calories,其中 calories[i] 代表好友第 i 天需要消耗的卡路里总量。再给定 lower 代表较低消耗的卡路里,upper 代表较高消耗的卡路里。再给定一个整数 k,代表连续 k 天。

  • 如果你的好友在这一天以及之后连续 k 天内消耗的总卡路里 T 小于 lower,则这一天的计划相对糟糕,并失去 1 分。
  • 如果你的好友在这一天以及之后连续 k 天内消耗的总卡路里 T 高于 upper,则这一天的计划相对优秀,并得到 1 分。
  • 如果你的好友在这一天以及之后连续 k 天内消耗的总卡路里 T 大于等于 lower,并且小于等于 upper,则这份计划普普通通,分值不做变动。

输出最后评估的得分情况。

解题思路 #

固定长度为 k 的滑动窗口题目。具体做法如下:

  1. score 用来维护得分情况,初始值为 0window_sum 用来维护窗口中卡路里总量。
  2. leftright 都指向数组的第一个元素,即:left = 0right = 0
  3. 向右移动 right,先将 k 个元素填入窗口中。
  4. 当窗口元素个数为 k 时,即:right - left + 1 >= k 时,计算窗口内的卡路里总量,并判断和 upperlower 的关系。同时维护得分情况。
  5. 然后向右移动 left,从而缩小窗口长度,即 left += 1,使得窗口大小始终保持为 k
  6. 重复 4 ~ 5 步,直到 right 到达数组末尾。

最后输出得分情况 score

代码 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution:
    def dietPlanPerformance(self, calories: List[int], k: int, lower: int, upper: int) -> int:
        left, right = 0, 0
        window_sum = 0
        score = 0
        while right < len(calories):
            window_sum += calories[right]

            if right - left + 1 >= k:
                if window_sum < lower:
                    score -= 1
                elif window_sum > upper:
                    score += 1
                window_sum -= calories[left]
                left += 1

            right += 1
        return score
本站总访问量  次  |  您是本站第  位访问者