1176. 健身计划评估
大约 2 分钟
1176. 健身计划评估
- 标签:数组、滑动窗口
- 难度:简单
题目链接
题目大意
描述:好友给自己制定了一份健身计划。想请你帮他评估一下这份计划是否合理。
给定一个数组 ,其中 代表好友第 天需要消耗的卡路里总量。再给定 代表较低消耗的卡路里, 代表较高消耗的卡路里。再给定一个整数 ,代表连续 天。
- 如果你的好友在这一天以及之后连续 天内消耗的总卡路里 小于 ,则这一天的计划相对糟糕,并失去 分。
- 如果你的好友在这一天以及之后连续 天内消耗的总卡路里 高于 ,则这一天的计划相对优秀,并得到 分。
- 如果你的好友在这一天以及之后连续 天内消耗的总卡路里 大于等于 ,并且小于等于 ,则这份计划普普通通,分值不做变动。
要求:输出最后评估的得分情况。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:calories = [1,2,3,4,5], k = 1, lower = 3, upper = 3
输出:0
解释:calories[0], calories[1] < lower 而 calories[3], calories[4] > upper, 总分 = 0.
- 示例 2:
输入:calories = [3,2], k = 2, lower = 0, upper = 1
输出:1
解释:calories[0] + calories[1] > upper, 总分 = 1.
解题思路
思路 1:滑动窗口
固定长度为 的滑动窗口题目。具体做法如下:
- 用来维护得分情况,初始值为 。 用来维护窗口中卡路里总量。
- 、 都指向数组的第一个元素,即:
left = 0
,right = 0
。 - 向右移动 ,先将 个元素填入窗口中。
- 当窗口元素个数为 时,即: 时,计算窗口内的卡路里总量,并判断和 、 的关系。同时维护得分情况。
- 然后向右移动 ,从而缩小窗口长度,即
left += 1
,使得窗口大小始终保持为 。 - 重复 步,直到 到达数组末尾。
最后输出得分情况 。
思路 1:代码
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
思路 1:复杂度分析
- 时间复杂度:,其中 为数组 的长度。
- 空间复杂度:。