网易首页 > 网易号 > 正文 申请入驻

2026-09-29:K 个元素的最大总和。用go语言,有一个整数数组,另外给出两个整数 k 和 mul。需要从数组中取出正好 k 个数,这些数的处理顺

0
分享至

2026-09-29:K 个元素的最大总和。用go语言,有一个整数数组,另外给出两个整数 k 和 mul。需要从数组中取出正好 k 个数,这些数的处理顺序可以自行安排。处理每一个被选中的数时,有两种方式可以任选一种:一种是把该数本身直接加入总分;另一种是把该数乘以当时 mul 的值,再把乘积加入总分。每处理完一个数,不管刚才选的是哪种方式,mul 都会自动减一,因此它可能变成零,也可能变成负数。目标是让最终得到的总和尽可能大,并返回这个最大的总和。

1 <= nums.length <= 100000。

1 <= nums[i] <= 100000。

1 <= k <= nums.length。

1 <= mul <= 100000。

输入: nums = [3,7,5,2], k = 2, mul = 4。

输出: 43。

解释:

一种最优方式如下:

一种最优选择是 nums[1] = 7 和 nums[2] = 5。

先处理 nums[1] = 7:选择乘法,因此贡献 7 * 4 = 28。此时,mul 变为 3。

接着处理 nums[2] = 5:选择乘法,因此贡献 5 * 3 = 15。

总和为 28 + 15 = 43。

题目来自力扣3974。

分步骤详细描述整个过程:

  1. 1. 准备输入数据
    有一个整数数组 nums,一个整数 k,一个整数 mul。
    nums 中每个元素都是正数(1 到 100000),k 表示要选出的元素个数,mul 是初始的乘数。

  2. 2. 对数组进行降序排序
    把 nums 中的所有元素按照从大到小的顺序排列。
    这样做的原因是:后面每个被选中的元素会依次对应一个乘数,而这个乘数是递减的(先是 mul,然后 mul-1,再然后 mul-2……直到变成 1,之后如果还有元素就保持为 1)。为了让总和最大,应该把最大的数分配给最大的乘数,把较小的数分配给较小的乘数。降序排序正好满足这个要求。

  3. 3. 初始化总和
    定义一个变量用来保存最终的总和,初始值为 0。

  4. 4. 遍历排序后数组的前 k 个元素
    因为只需要恰好 k 个元素,所以直接从排序后的数组开头取 k 个即可。
    依次处理这 k 个元素,每处理一个,就把它对总和的贡献加进去。

  5. 5. 对每个元素计算有效乘数
    当前有一个乘数 mul。
    对于当前元素 x,判断应该用哪个乘数来乘它。
    如果当前 mul 大于等于 1,那么乘以 mul 会让结果变大(因为 x 是正数),所以直接使用 mul。
    如果当前 mul 小于等于 0,乘以它会让结果变成零或负数,这显然不如直接加 x 本身,所以这时把有效乘数视为 1。
    换句话说,有效乘数就是 mul 和 1 中的较大值。

  6. 6. 累加贡献
    把当前元素 x 乘以这个有效乘数,得到一个贡献值。
    把这个贡献值加到总和变量中。

  7. 7. 更新 mul
    每处理完一个元素,无论刚才用了哪种方式,mul 都要自动减 1。
    这样下一个元素面对的就是比之前小 1 的乘数。
    如果 mul 已经很小,减到 0 或负数也没关系,因为下一步计算有效乘数时会用 1 来替代。

  8. 8. 循环直到处理完 k 个元素
    重复第 5 到第 7 步,直到前 k 个元素全部处理完毕。

  9. 9. 返回总和
    最终得到的总和就是可能的最大总和,直接返回。

为什么这样能得到最大值?
因为所有 nums 中的数都是正数,而乘数序列是单调不增的:先是 mul, mul-1, mul-2, …,降到 1 之后就一直是 1。
对于正数来说,越大的数乘以越大的乘数,对总和的贡献越大。
所以把最大的数放在最前面,让它享受最大的乘数,依次类推,就能让总和最大化。

时间复杂度和额外空间复杂度:

  • • 时间复杂度:
    主要消耗在排序上。数组长度为 n,排序需要 O(n log n) 的时间。
    排序之后只需要遍历前 k 个元素,时间复杂度为 O(k)。
    因为 k ≤ n,所以总时间复杂度为 O(n log n)。

  • • 额外空间复杂度:
    算法本身除了输入数组外,只使用了常数个变量(总和、循环变量、当前乘数等),没有开辟与 n 或 k 成比例的额外空间。
    排序过程如果是原地排序,通常只需要 O(log n) 的递归栈空间(比如快速排序的递归深度)。
    因此,额外空间复杂度可以认为是 O(1)(不考虑排序递归栈),或者严格说为 O(log n)(包含排序的栈空间)。但通常在这种算法分析中,会表述为额外空间 O(1)。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func maxSum(nums []int, k int, mul int) (ans int64) {
slices.SortFunc(nums, func(a, b int)int { return b - a })
for _, x := range nums[:k] {
ans += int64(x) * int64(max(mul, 1))
mul--
}
return
}

func main() {
nums := []int{3, 7, 5, 2}
k := 2
mul := 4
result := maxSum(nums, k, mul)
fmt.Println(result)
}

Python完整代码如下:

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

from typing import List

def max_sum(nums: List[int], k: int, mul: int) -> int:
nums.sort(reverse=True)
ans = 0
for x in nums[:k]:
ans += x * max(mul, 1)
mul -= 1
return ans

if __name__ == "__main__":
nums = [3, 7, 5, 2]
k = 2
mul = 4
result = max_sum(nums, k, mul)
print(result)

C++完整代码如下:

  




using namespace std;

long long maxSum(vector& nums, int k, int mul) {
// 降序排序
sort(nums.begin(), nums.end(), greater());
long long ans = 0;
for (int i = 0; i < k; ++i) {
int x = nums[i];
ans += (long long)x * max(mul, 1);
mul--;
}
return ans;
}

int main() {
vector nums = {3, 7, 5, 2};
int k = 2;
int mul = 4;
long long result = maxSum(nums, k, mul);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
2年8200万!你好,欧文!热火最快速度交易

2年8200万!你好,欧文!热火最快速度交易

篮球实战宝典
2026-09-30 20:28:29
官媒曝光8年,为何能继续荒唐8年?

官媒曝光8年,为何能继续荒唐8年?

巧哥有话说
2026-09-30 11:12:54
识别率接近 100%!德国科学家发出警告,WiFi 竟然可以成为隐形监控

识别率接近 100%!德国科学家发出警告,WiFi 竟然可以成为隐形监控

说宇宙
2026-09-30 18:15:05
朱忠明当选上海市市长

朱忠明当选上海市市长

新京报政事儿
2026-09-30 17:26:06
女子在KTV唱歌2小时后,和朋友的3台手机拍照均出现紫色斑点,质疑镜头被氛围灯灼伤,商家:无法确定与包房灯有关

女子在KTV唱歌2小时后,和朋友的3台手机拍照均出现紫色斑点,质疑镜头被氛围灯灼伤,商家:无法确定与包房灯有关

蓬勃新闻
2026-09-30 18:39:00
张本智和性丑闻曝光!日本网友:运动员都瞄准女主播?照照镜子吧

张本智和性丑闻曝光!日本网友:运动员都瞄准女主播?照照镜子吧

念洲
2026-09-30 15:37:30
国台办:中国共产党鲜明提出收复台湾的主张,支持和推动了台湾光复运动

国台办:中国共产党鲜明提出收复台湾的主张,支持和推动了台湾光复运动

京彩台湾
2026-09-30 22:15:05
世界乒联:王楚钦、林诗栋因伤退出WTT中国大满贯2026

世界乒联:王楚钦、林诗栋因伤退出WTT中国大满贯2026

界面新闻
2026-09-30 22:13:16
压哨夺金!9月29日收官,最新金牌榜:超日本98金17岁小将创历史

压哨夺金!9月29日收官,最新金牌榜:超日本98金17岁小将创历史

用冷眼洞悉世界
2026-09-30 07:22:51
王皓怒了!男单决赛后朝看台上的中国观众用力鼓掌 被王励勤拉走

王皓怒了!男单决赛后朝看台上的中国观众用力鼓掌 被王励勤拉走

念洲
2026-09-30 18:56:36
民粹的胜利,不值得狂欢

民粹的胜利,不值得狂欢

晓看说
2026-09-30 11:28:59
北大化学才女李天乐,利用职务之便,将清华毕业的丈夫,一点点“熬”死在病房!她领出的剧毒为何消失了?

北大化学才女李天乐,利用职务之便,将清华毕业的丈夫,一点点“熬”死在病房!她领出的剧毒为何消失了?

史源观点
2026-09-29 19:09:22
淘宝自行车店主拒绝“到手刀”后遭报复式退货 运费超过车价 有异常警示平台仍支持买家

淘宝自行车店主拒绝“到手刀”后遭报复式退货 运费超过车价 有异常警示平台仍支持买家

信网
2026-09-30 15:27:04
东航回应空姐下跪!乘客闹完事就逃,将依法维护尊严,央广网出手

东航回应空姐下跪!乘客闹完事就逃,将依法维护尊严,央广网出手

小鋭有话说
2026-09-30 18:54:30
每天多吃100克就危险?你可能还在天天吃!882万人超大型研究:超加工食品致心血管发病风险飙升14%

每天多吃100克就危险?你可能还在天天吃!882万人超大型研究:超加工食品致心血管发病风险飙升14%

徐德文科学频道
2026-09-30 00:50:39
西蒙-高茨谈林诗栋发球:亚运会没有TTR,这个发球动作又回来了

西蒙-高茨谈林诗栋发球:亚运会没有TTR,这个发球动作又回来了

懂球帝
2026-09-30 15:39:10
普京:俄罗斯不会满世界跑去“乞讨”,不像有些国家……

普京:俄罗斯不会满世界跑去“乞讨”,不像有些国家……

环球网资讯
2026-09-30 20:37:06
1-2!输球不可怕,可怕的是赛后安东尼奥的这番话:让人很揪心!

1-2!输球不可怕,可怕的是赛后安东尼奥的这番话:让人很揪心!

田先生篮球
2026-09-30 16:55:07
满心欢喜出境游,72岁阿婆递上护照,边检民警愣住了!证件作废,旅游泡汤

满心欢喜出境游,72岁阿婆递上护照,边检民警愣住了!证件作废,旅游泡汤

新民晚报
2026-09-30 13:27:21
生娃不用自己掏钱了,会有更多人敢生吗?

生娃不用自己掏钱了,会有更多人敢生吗?

育娲人口智库
2026-09-30 17:23:01
2026-10-01 02:31:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1488文章数 83关注度
往期回顾 全部

科技要闻

OpenAI凌晨大上新!新助手dots迎战Muse

头条要闻

10月1日零时高速免费 车主卡点省560多元

头条要闻

10月1日零时高速免费 车主卡点省560多元

体育要闻

30天30队·火箭:乌度卡的控制欲

娱乐要闻

胡歌现身游本昌遗体告别仪式

财经要闻

“杭州六小龙”迎来价值重估

汽车要闻

燃油车的最佳平替 长城大狗HEV简单好开更经济

态度原创

时尚
本地
健康
房产
军事航空

从理性到反叛,看米兰时装周风格流转

本地新闻

中秋逛白塔寺,体验国医妙荟雅集

刷酸祛痘,为什么有人翻车?

房产要闻

利好频发!国庆置业窗口期,收好这份优惠攻略!

军事要闻

美军最后2500人撤离伊拉克

无障碍浏览 进入关怀版