2025-03-28:超级饮料的最大强化能量。用go语言,你有两个整数数组 energyDrinkA 和 energyDrink

举报
福大大架构师每日一题 发表于 2025/03/28 08:59:29 2025/03/28
【摘要】 2025-03-28:超级饮料的最大强化能量。用go语言,你有两个整数数组 energyDrinkA 和 energyDrinkB,它们的长度都是 n,分别表示 A 和 B 两种能量饮料在每小时提供的强化能量。你的目标是选择每小时饮用一种能量饮料,以最大化在接下来的 n 小时内获得的总强化能量。需要注意的是,若你从一种能量饮料切换到另一种,必须等待读体能系统恢复,这样在恢复期间的那个小时内你...

2025-03-28:超级饮料的最大强化能量。用go语言,你有两个整数数组 energyDrinkA 和 energyDrinkB,它们的长度都是 n,分别表示 A 和 B 两种能量饮料在每小时提供的强化能量。

你的目标是选择每小时饮用一种能量饮料,以最大化在接下来的 n 小时内获得的总强化能量。需要注意的是,若你从一种能量饮料切换到另一种,必须等待读体能系统恢复,这样在恢复期间的那个小时内你不会得到任何强化能量。

请计算并返回在这 n 小时内你能够获得的最大总强化能量。在选择饮用的能量饮料时,你可以从任意一种饮料开始。

n == energyDrinkA.length == energyDrinkB.length。

3 <= n <= 100000。

1 <= energyDrinkA[i], energyDrinkB[i] <= 100000。

输入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]。

输出:5。

解释:

要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)。

题目来自leetcode3259。

大体步骤如下:

  1. 首先,定义了一个函数 maxEnergyBoost,接受两个整数数组 energyDrinkA 和 energyDrinkB,并返回一个 int64 类型的值。

  2. 函数中首先获取数组的长度 n,并创建了一个二维数组 d 用来保存计算过程中的状态值,d 的大小为 n+1 行 2 列。

  3. 使用 for 循环遍历数组元素,对于每个位置 i,计算当前位置选择 A 类能量饮料和选择 B 类能量饮料时的总强化能量。

  4. 在计算过程中,根据规则如果当前位置 i 大于等于 2,就需要考虑是否要在上一次选择的基础上切换到另一种能量饮料。

  5. 最终返回在 n 小时内获得的最大总强化能量,即返回 d[n][0] 和 d[n][1] 中较大的值。

  6. 在主函数 main 中,定义了两个示例数组 energyDrinkA 和 energyDrinkB,并调用了 maxEnergyBoost 函数进行计算,并将结果输出打印。

总的时间复杂度为 O(n),因为程序中使用了单次遍历数组的方式解决问题。

总的额外空间复杂度为 O(n),复杂度是由定义的二维数组 d 决定的。

Go完整代码如下:

package main

import (
	"fmt"
)

func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 {
	n := len(energyDrinkA)
	d := make([][2]int64, n+1)
	for i := 1; i <= n; i++ {
		d[i][0] = d[i-1][0] + int64(energyDrinkA[i-1])
		d[i][1] = d[i-1][1] + int64(energyDrinkB[i-1])
		if i >= 2 {
			d[i][0] = max(d[i][0], d[i-2][1]+int64(energyDrinkA[i-1]))
			d[i][1] = max(d[i][1], d[i-2][0]+int64(energyDrinkB[i-1]))
		}
	}
	return max(d[n][0], d[n][1])
}

func main() {
	energyDrinkA := []int{1, 3, 1}
	energyDrinkB := []int{3, 1, 1}
	result := maxEnergyBoost(energyDrinkA, energyDrinkB)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def max_energy_boost(energy_drink_a, energy_drink_b):
    n = len(energy_drink_a)
    d = [[0] * 2 for _ in range(n + 1)]

    for i in range(1, n + 1):
        d[i][0] = d[i - 1][0] + energy_drink_a[i - 1]
        d[i][1] = d[i - 1][1] + energy_drink_b[i - 1]
        if i >= 2:
            d[i][0] = max(d[i][0], d[i - 2][1] + energy_drink_a[i - 1])
            d[i][1] = max(d[i][1], d[i - 2][0] + energy_drink_b[i - 1])

    return max(d[n][0], d[n][1])

if __name__ == "__main__":
    energy_drink_a = [1, 3, 1]
    energy_drink_b = [3, 1, 1]
    result = max_energy_boost(energy_drink_a, energy_drink_b)
    print(result)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。