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

2026-04-29:二进制交换后的最大分数。用go语言,给定一个长度为 n 的整数数组 nums 和一个长度相同的二进制字符串 s。 初始得分为 0。对

0
分享至

2026-04-29:二进制交换后的最大分数。用go语言,给定一个长度为 n 的整数数组 nums 和一个长度相同的二进制字符串 s。

初始得分为 0。对于字符串中每个位置上字符为 '1' 的下标 i,分数都会加上 nums[i]。

你可以进行任意次操作,也可以一次都不做。每次操作时,可以选择一个位置 i(0 <= i < n - 1),要求 s[i] = '0' 且 s[i + 1] = '1',然后把这两个字符交换。

请计算并返回经过这些操作后,能够得到的最高分数。

n == nums.length == s.length。

1 <= n <= 100000。

1 <= nums[i] <= 1000000000。

s[i] 是 '0' 或 '1'。

输入: nums = [2,1,5,2,3], s = "01010"。

输出: 7。

解释:

我们可以执行以下交换操作:

在下标 i = 0 处交换:"01010" 变为 "10010"

在下标 i = 2 处交换:"10010" 变为 "10100"

下标 0 和 2 包含 '1',贡献的分数为 nums[0] + nums[2] = 2 + 5 = 7。这是可以获得的最大分数。

题目来自力扣3781。

解题过程详细解析

先明确核心规则

  1. 1. 初始分数:所有s中为1的位置,直接加对应nums值;

  2. 2. 允许操作:只能交换相邻的01(要求左边是0、右边是1),可以交换任意次;

  3. 3. 本质:1可以向左移动到任意0的位置(因为多次相邻交换能让1持续左移),我们的目标是:让1停在数值最大的位置上,最大化总分。

输入示例:
nums = [2, 1, 5, 2, 3]s = "0 1 0 1 0"(下标0~4)
初始s1的位置:下标1、下标3。

一、整体解题思路

我们从右向左遍历数组(从最后一个元素往第一个元素走),配合最小堆实现最优选择:

  1. 1. 最小堆的作用:存储当前已选中的1对应的数值,堆顶永远是最小的那个数;

  2. 2. 遍历规则:

  • • 遇到s[i]='1':必须选这个位置,数值加入总分,同时放入最小堆;

  • • 遇到s[i]='0':这个位置可以放一个1(因为1能左移过来),如果当前位置的数值 > 堆里最小的数,就替换:用更大的数替换堆里最小的数,总分也同步更新(只加差值);

3. 最终堆里保留的就是k个最大的数(k是原字符串中1的个数),总和就是最大分数。

二、分步骤详细过程(对应示例遍历)

原数组:下标0(2)、下标1(1)、下标2(5)、下标3(2)、下标4(3)
原字符串:0、1、0、1、0
原1的数量:2个(最终必须选2个位置放1)
遍历方向:从下标4 → 下标0

步骤1:遍历下标4(数值3,s='0')

  • • 当前堆为空,没有可以替换的数,不做任何操作

步骤2:遍历下标3(数值2,s='1')
  • • 这是必须选的1,总分 +=2(当前总分=2);

  • • 把数值2放入最小堆,堆:[2](堆顶是2)。

步骤3:遍历下标2(数值5,s='0')
  • • 这是0的位置,可以放1;

  • • 比较:当前数5 > 堆顶最小值2;

  • • 执行替换:总分 += 5-2 =3(总分=2+3=5);

  • • 用5替换堆顶的2,堆调整为[5](堆顶是5)。

步骤4:遍历下标1(数值1,s='1')
  • • 这是必须选的1,总分 +=1(当前总分=5+1=6);

  • • 把数值1放入最小堆,堆:[1,5](堆顶是最小的1)。

步骤5:遍历下标0(数值2,s='0')
  • • 这是0的位置,可以放1;

  • • 比较:当前数2 > 堆顶最小值1;

  • • 执行替换:总分 +=2-1=1(总分=6+1=7);

  • • 用2替换堆顶的1,堆调整为[2,5](堆顶是2)。

三、最终结果

遍历结束,总分=7,和题目示例输出完全一致。
最终选中的两个位置:下标0(2)、下标2(5),总和2+5=7。

四、复杂度分析 1. 时间复杂度

  • • 遍历数组:O(n)(n是数组长度,每个元素仅遍历一次);

  • • 堆操作:每个元素最多入堆、出堆、调整堆各一次,堆的大小最大为k(原1的个数),单次堆操作O(logk)

  • • 总时间复杂度:O(n log n)(logk ≤ logn,是最优可接受复杂度)。

2. 额外空间复杂度
  • • 仅使用了一个最小堆存储元素,堆的最大空间为k(原1的个数);

  • • 总额外空间复杂度:O(n)(最坏情况全是1,堆大小为n)。

总结
  1. 1. 核心逻辑:从右向左遍历,用最小堆动态保留最大的k个数值(k=原1的数量);

  2. 2. 操作本质:利用规则让1左移,替换掉更小的数值,实现分数最大化;

  3. 3. 复杂度:时间O(n log n),空间O(n),能高效处理n≤1e5的大数据量。

Go完整代码如下:

package main

import (
"container/heap"
"fmt"
"sort"
)

func maximumScore(nums []int, s string) (ans int64) {
h := hp{}
// Traverse from the end to the beginning
for i := len(nums) - 1; i >= 0; i-- {
x := nums[i]
if s[i] == '1' {
ans += int64(x)
heap.Push(&h, x)
} elseif h.Len() > 0 && x > h.IntSlice[0] {
ans += int64(x - h.IntSlice[0])
h.IntSlice[0] = x
heap.Fix(&h, 0)
}
}
return
}

type hp struct{ sort.IntSlice }

func (h *hp) Push(v any) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (hp) Pop() (_ any) { return }

func main() {
nums := []int{2, 1, 5, 2, 3}
s := "01010"
result := maximumScore(nums, s)
fmt.Println(result)
}

Python完整代码如下:

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

import heapq

def maximumScore(nums, s):
ans = 0
h = [] # min heap
# Traverse from the end to the beginning
for i in range(len(nums) - 1, -1, -1):
x = nums[i]
if s[i] == '1':
ans += x
heapq.heappush(h, x)
elif h and x > h[0]:
ans += x - h[0]
heapq.heapreplace(h, x) # pop smallest and push x
return ans

def main():
nums = [2, 1, 5, 2, 3]
s = "01010"
result = maximumScore(nums, s)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  





using namespace std;

long long maximumScore(vector& nums, string s) {
long long ans = 0;
// Min heap using greater
priority_queue, greater> pq;

// Traverse from the end to the beginning
for (int i = nums.size() - 1; i >= 0; i--) {
int x = nums[i];
if (s[i] == '1') {
ans += x;
pq.push(x);
} elseif (!pq.empty() && x > pq.top()) {
ans += x - pq.top();
pq.pop();
pq.push(x);
}
}
return ans;
}

int main() {
vector nums = {2, 1, 5, 2, 3};
string s = "01010";
long long result = maximumScore(nums, s);
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.

相关推荐
热点推荐
歌唱家关牧村:我这辈子做的最正确的决定就是,45岁带娃嫁给高官,如今被宠了27年

歌唱家关牧村:我这辈子做的最正确的决定就是,45岁带娃嫁给高官,如今被宠了27年

品茗赏娱
2026-08-10 22:34:24
遇见狠人了!浙江一车主图方便占用他人车位,一夜醒来发现四扇车门变形损失大几千

遇见狠人了!浙江一车主图方便占用他人车位,一夜醒来发现四扇车门变形损失大几千

Mr王的饭后茶
2026-08-11 16:20:18
问界给积极车主送临期大米?离过期仅剩2天

问界给积极车主送临期大米?离过期仅剩2天

西虹市闲话
2026-08-11 17:27:05
广东24岁美女姜小柔去世!砸观音荒地钉八字,知情人曝死因属横祸

广东24岁美女姜小柔去世!砸观音荒地钉八字,知情人曝死因属横祸

米果说识
2026-08-11 10:12:53
伊朗最高领袖连夜签了6张任命状:71岁老将一人身兼两个关键职位,他前面两任全死于空袭

伊朗最高领袖连夜签了6张任命状:71岁老将一人身兼两个关键职位,他前面两任全死于空袭

网易新闻出品
2026-08-11 18:56:48
男童被巨浪卷走后续,官媒怒批家属,当地不敢救,救了也必死无疑

男童被巨浪卷走后续,官媒怒批家属,当地不敢救,救了也必死无疑

社会日日鲜
2026-08-11 09:21:27
2026年了,为什么国家突然要再扫一年黑?

2026年了,为什么国家突然要再扫一年黑?

李博世财经
2026-08-11 09:51:22
内蒙古一警车被换标成长城汽车,网友称:哪是换标那么简单

内蒙古一警车被换标成长城汽车,网友称:哪是换标那么简单

Mr王的饭后茶
2026-08-11 10:55:29
卫诗雅爆冷拿下百花影后孤身离场!全场只有朱一龙送上拥抱太戳人

卫诗雅爆冷拿下百花影后孤身离场!全场只有朱一龙送上拥抱太戳人

阿废冷眼观察所
2026-08-12 04:26:53
上海45岁女程序员被裁拿30多万,简历全沉了,现在送外卖,老妈哭了,哭的很伤心

上海45岁女程序员被裁拿30多万,简历全沉了,现在送外卖,老妈哭了,哭的很伤心

捣蛋窝
2026-08-11 22:49:34
韩旭:为什么说近些年司法进步不容乐观?

韩旭:为什么说近些年司法进步不容乐观?

天下说法
2026-08-11 09:11:44
第二批朝鲜兵抵达俄罗斯!兵力5万+新武器,泽连斯基最担心的事情还是发生了

第二批朝鲜兵抵达俄罗斯!兵力5万+新武器,泽连斯基最担心的事情还是发生了

军武次位面
2026-08-10 17:55:01
财经大V:80%的男人一个月赚不到7000元,如果你税后7000元,不管男女,你可能已经胜过90%的人,评论区一片认同

财经大V:80%的男人一个月赚不到7000元,如果你税后7000元,不管男女,你可能已经胜过90%的人,评论区一片认同

谭谈社会
2026-08-11 20:56:50
看完沈腾《欢迎来龙餐馆》后,猛然发现这个狂砍400多亿票房的中国影史第一人,在国内却是个零蛋影帝!

看完沈腾《欢迎来龙餐馆》后,猛然发现这个狂砍400多亿票房的中国影史第一人,在国内却是个零蛋影帝!

娱乐故事
2026-08-11 21:42:55
WTT瑞典大满贯:大爆冷!男单头号种子0:3一轮游,被扣2000分

WTT瑞典大满贯:大爆冷!男单头号种子0:3一轮游,被扣2000分

国乒二三事
2026-08-12 03:50:21
广东省最强医院迎来最大规模扩建

广东省最强医院迎来最大规模扩建

牛锅巴小钒
2026-08-12 05:15:09
无视中国网友!波兰名将拒道歉 继续辱华:中国气味像米饭配鸡肉

无视中国网友!波兰名将拒道歉 继续辱华:中国气味像米饭配鸡肉

念洲
2026-08-11 06:50:26
巴沙尔·阿萨德,被判死刑

巴沙尔·阿萨德,被判死刑

南方都市报
2026-08-11 17:59:32
八卦媒体曝方文山出轨,与艺人Y女士多年保持地下情人关系

八卦媒体曝方文山出轨,与艺人Y女士多年保持地下情人关系

韩小娱
2026-08-11 12:01:28
脸都不要了?王宝强百花奖0票,这是200亿影帝的“羞辱”之夜

脸都不要了?王宝强百花奖0票,这是200亿影帝的“羞辱”之夜

文刀贰
2026-08-10 22:59:15
2026-08-12 08:36:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1388文章数 79关注度
往期回顾 全部

科技要闻

AI大战变天:扎克伯格突然回头

头条要闻

57岁保洁员掏空5万积蓄做医美 术后1个月感到视力下降

头条要闻

57岁保洁员掏空5万积蓄做医美 术后1个月感到视力下降

体育要闻

NBA老顽童,抽着大麻喝着小酒告别了

娱乐要闻

“雅典娜”确认被害 细节令人发指!

财经要闻

AI泡沫的剧本,是2008年的次贷危机?

汽车要闻

闪充/天神之眼B/云辇-C 2027款海豹06售9.99万元起

态度原创

房产
游戏
艺术
旅游
亲子

房产要闻

突发,崖州湾又有大动作!

魔兽世界:时光服紧急削弱,精英玩家破灭,难度党为什么消失了?

艺术要闻

色彩的盛宴,视觉的狂欢:西班牙水彩大师福斯蒂诺·马丁·冈萨雷斯的艺术世界

旅游要闻

四川自贡小哥带200元,骑电动车往返拉萨3500公里:最牛骑行者

亲子要闻

当女儿说要出门,给她一个惊喜

无障碍浏览 进入关怀版