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

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.

相关推荐
热点推荐
1951年,戴笠独子被处决的消息传到台湾,蒋介石给毛人凤下了一条命令

1951年,戴笠独子被处决的消息传到台湾,蒋介石给毛人凤下了一条命令

晓张说
2026-04-27 07:18:18
余承东再次向奇瑞董事长,正式道歉

余承东再次向奇瑞董事长,正式道歉

小李车评李建红
2026-04-29 08:00:03
小宝与王某雷,谁探访花的数量更多?

小宝与王某雷,谁探访花的数量更多?

挪威森林
2026-01-31 12:15:26
毫无顾忌!山西外教痛斥青岛8打5,裁判吹空气犯规助力青岛成污点

毫无顾忌!山西外教痛斥青岛8打5,裁判吹空气犯规助力青岛成污点

体坛野秀才
2026-04-30 00:38:08
感谢墨菲,赵心童输球却因祸得福,球迷认清三个事实

感谢墨菲,赵心童输球却因祸得福,球迷认清三个事实

生活新鲜市
2026-04-30 00:42:54
黑尾酱,彻底消失了?

黑尾酱,彻底消失了?

生如稗草
2026-03-15 08:48:11
不用自己取消!移动4月30日自动关停—一场静悄悄的"数字换防"

不用自己取消!移动4月30日自动关停—一场静悄悄的"数字换防"

Thurman在昆明
2026-04-29 13:17:12
美股三大指数收盘涨跌不一 苹果概念、存储概念股大涨

美股三大指数收盘涨跌不一 苹果概念、存储概念股大涨

财联社
2026-04-30 04:16:05
刘冰冰,被免去佛山高新区管委会财政金融局局长职务

刘冰冰,被免去佛山高新区管委会财政金融局局长职务

南方都市报
2026-04-28 18:21:08
国家一级女演员陈丽云被逮捕!

国家一级女演员陈丽云被逮捕!

许三岁
2026-03-28 09:24:30
济南一清代四合院时隔8个月再度拍卖,起拍价仍为3500万元,代理人:系区文保单位,需验资2000万元才能看房

济南一清代四合院时隔8个月再度拍卖,起拍价仍为3500万元,代理人:系区文保单位,需验资2000万元才能看房

极目新闻
2026-04-29 19:34:48
NBA祭出反摆烂重拳!3-2-1乐透方案出炉,马刺火箭重建天差地别!

NBA祭出反摆烂重拳!3-2-1乐透方案出炉,马刺火箭重建天差地别!

田先生篮球
2026-04-29 06:59:56
真相大白!赵心童输球原因曝光,真不是打不过墨菲吴宜泽10-6晋级

真相大白!赵心童输球原因曝光,真不是打不过墨菲吴宜泽10-6晋级

曹说体育
2026-04-30 01:07:22
最败家富二代濒临破产?800亿地产豪门,快被接班人卖光了

最败家富二代濒临破产?800亿地产豪门,快被接班人卖光了

金融八卦女
2026-04-29 16:03:41
乌克兰的艰苦岁月:610亿美元到900亿欧元

乌克兰的艰苦岁月:610亿美元到900亿欧元

书生论剑
2026-04-29 06:48:54
扎哈罗娃:我们不像乌克兰,不拿士兵的生命去打没意义的仗

扎哈罗娃:我们不像乌克兰,不拿士兵的生命去打没意义的仗

Ck的蜜糖
2026-04-29 09:09:07
中央政治局定调:深入整治内卷式竞争!

中央政治局定调:深入整治内卷式竞争!

爱下厨的阿酾
2026-04-30 01:36:50
第一次对“长尾夹”刮目相看!以为只是办公品,没想到用途这么广

第一次对“长尾夹”刮目相看!以为只是办公品,没想到用途这么广

美家指南
2026-04-28 15:54:08
塔帅:欧冠判罚缺乏一致性,拜仁的手球判了点,埃泽这球也该是点

塔帅:欧冠判罚缺乏一致性,拜仁的手球判了点,埃泽这球也该是点

懂球帝
2026-04-30 06:18:57
放弃 1 亿迪奥曼德!利物浦转攻世界级边锋,6200 万实力完胜

放弃 1 亿迪奥曼德!利物浦转攻世界级边锋,6200 万实力完胜

澜归序
2026-04-30 05:37:20
2026-04-30 07:00:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1200文章数 67关注度
往期回顾 全部

科技要闻

今晨庭审纪实|马斯克当庭讲述OpenAI被偷走

头条要闻

普京与特朗普通话:美对伊朗采取地面行动是危险选择

头条要闻

普京与特朗普通话:美对伊朗采取地面行动是危险选择

体育要闻

一场九球狂欢,各路神仙批量下凡

娱乐要闻

马頔一句话,孙杨妈妈怒骂节目组2小时

财经要闻

苏州,率先进入牛市

汽车要闻

技术天花板再摸高 全能型的奕境X9首秀

态度原创

旅游
家居
数码
艺术
公开课

旅游要闻

48家公园推出110项假日特色活动

家居要闻

寂然无界 简洁风格

数码要闻

极米RS30系列投影仪发布,8822-13499元

艺术要闻

许家印收藏的字

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版