2024-09-11:用go语言,给定一个从0开始的整数数组nums和一个正奇数整数k, 要求在nums数组中选择k个不重叠的子

举报
福大大架构师每日一题 发表于 2024/09/11 21:36:52 2024/09/11
【摘要】 2024-09-11:用go语言,给定一个从0开始的整数数组nums和一个正奇数整数k,要求在nums数组中选择k个不重叠的子数组,使得这些子数组的能量值之和最大。子数组的能量值是通过一定规则计算得到的,具体规则是对于某个子数组,将其每个元素乘以一个特定系数,并将这些结果相加,系数随着元素在子数组中位置的变化而变化。最终,要求找到一组k个不重叠的子数组,使得这些子数组的能量值之和达到最大值。...

2024-09-11:用go语言,给定一个从0开始的整数数组nums和一个正奇数整数k,

要求在nums数组中选择k个不重叠的子数组,

使得这些子数组的能量值之和最大。

子数组的能量值是通过一定规则计算得到的,

具体规则是对于某个子数组,将其每个元素乘以一个特定系数,

并将这些结果相加,系数随着元素在子数组中位置的变化而变化。

最终,要求找到一组k个不重叠的子数组,使得这些子数组的能量值之和达到最大值。

需要注意的是,选择的子数组不需要覆盖整个原始数组。

最后要返回能够获得的最大能量值。

输入:nums = [1,2,3,-1,2], k = 3。

输出:22。

解释:选择 3 个子数组的最好方式是选择:nums[0…2] ,nums[3…3] 和 nums[4…4] 。能量值为 (1 + 2 + 3) * 3 - (-1) * 2 + 2 * 1 = 22 。

答案2024-09-11:

chatgpt

题目来自leetcode3077。

大体步骤如下:

1.创建长度为 n+1 的累积和数组 s,其中 s[i] 存储前 i 个元素的和。

2.创建长度为 n+1 的数组 f,用于存放最大能量值累积。

3.循环k次,表示每次选择一个子数组的过程:

3.a.初始化 pre 为 f[i-1],f[i-1] 为负无穷大,设置初始最大值为负无穷大,定义一个权重 w。

3.b.从第 i 个位置开始循环到 n-k+i 位置,计算每次选择一个子数组后的最大能量值,并更新 f[j]。

4.返回最终的最大能量值 f[n]。

总的时间复杂度为 O(n*k),其中 n 为数组的长度。

总的额外空间复杂度为 O(n),主要由额外创建的两个长度为 n+1 的数组所占据。

Go完整代码如下:

package main

import (
	"fmt"
	"math"
)

func maximumStrength(nums []int, k int) int64 {
	n := len(nums)
	s := make([]int, n+1)
	for i, x := range nums {
		s[i+1] = s[i] + x
	}
	f := make([]int, n+1)
	for i := 1; i <= k; i++ {
		pre := f[i-1]
		f[i-1] = math.MinInt
		mx := math.MinInt
		w := (k - i + 1) * (i%2*2 - 1)
		for j := i; j <= n-k+i; j++ {
			mx = max(mx, pre-s[j-1]*w)
			pre = f[j]
			f[j] = max(f[j-1], s[j]*w+mx)
		}
	}
	return int64(f[n])
}

func main() {
	nums := []int{1, 2, 3, -1, 2}
	k := 3
	fmt.Println(maximumStrength(nums, k))
}

在这里插入图片描述

Rust完整代码如下:

package main

import (
	"fmt"
	"math"
)

func maximumStrength(nums []int, k int) int64 {
	n := len(nums)
	s := make([]int, n+1)
	for i, x := range nums {
		s[i+1] = s[i] + x
	}
	f := make([]int, n+1)
	for i := 1; i <= k; i++ {
		pre := f[i-1]
		f[i-1] = math.MinInt
		mx := math.MinInt
		w := (k - i + 1) * (i%2*2 - 1)
		for j := i; j <= n-k+i; j++ {
			mx = max(mx, pre-s[j-1]*w)
			pre = f[j]
			f[j] = max(f[j-1], s[j]*w+mx)
		}
	}
	return int64(f[n])
}

func main() {
	nums := []int{1, 2, 3, -1, 2}
	k := 3
	fmt.Println(maximumStrength(nums, k))
}

在这里插入图片描述

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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