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

2026-09-11:下标覆盖处的最大总和。用go语言,有一个长度为 n 的整数数组 nums,还有一个长度同样为 n 的二进制字符串 s。 对于每个位

0
分享至

2026-09-11:下标覆盖处的最大总和。用go语言,有一个长度为 n 的整数数组 nums,还有一个长度同样为 n 的二进制字符串 s。

对于每个位置 i:

  • • 如果 s[i] 是 '1',表示这个位置一开始有一个标记;

  • • 如果 s[i] 是 '0',表示这个位置一开始没有标记。

你可以进行任意多次这样的操作:

  • • 选一个当前在位置 i 的标记,其中 i 必须大于 0;

  • • 并且这个标记以前从来没有被移动过;

  • • 然后把它从位置 i 移动到位置 i - 1。

所有移动结束后,只要某个位置上有标记,就说明这个位置被覆盖了。

要求返回一个整数,表示在采取最优移动方案后,所有被覆盖位置上的 nums 数值之和最大是多少。

1 <= n == nums.length == s.length <= 100000。

1 <= nums[i] <= 100000。

s[i] 要么是 '0',要么是 '1'。

输入: nums = [9,2,6,1], s = "0101"。

输出: 15。

解释:

初始时,下标 1 和 3 包含标记。

将标记从下标 3 移动到下标 2。

将标记从下标 1 移动到下标 0。

被覆盖的下标为 [0, 2],所以总值为 nums[0] + nums[2]

题目来自力扣3952。

这个函数用的是一次从左到右的动态规划扫描。核心观察是:每个初始标记都在s[i] == '1'的位置,并且每个标记最多只能向左移动一格,也就是从ii-1。所以一个位置i是否被覆盖,只可能来自两种来源:

  1. 1. 它自己有初始标记,并且选择不移动;

  2. 2. 它右边相邻位置i+1有初始标记,并且那个标记选择左移到i

因此,问题可以看成:每个'1'标记选择覆盖自己,或者覆盖左边相邻位置,使最终被覆盖位置的nums总和最大。

代码中维护了两个状态值:

  • f0:可以理解为“已经确定下来的最优覆盖总和”,并且没有把当前位置预留给右边的标记来覆盖;

  • f1:可以理解为“暂时预支了当前位置被覆盖”的最优总和,也就是假设当前位置会被右边的'1'左移过来覆盖,先把它加上,等待后面遇到'1'时兑现。

具体过程如下:

  1. 1. 初始化f0 = 0f1 = 0

  2. 2. 从左到右遍历每个下标i,记当前数值为x = nums[i]

  3. 3. 如果s[i] == '0'

  • • 这个位置自己没有初始标记,不能靠自己覆盖。

  • • 它唯一可能被覆盖的方式,是右边相邻位置i+1的标记左移过来。

  • • 所以已经确定的状态f0不变;

  • • 同时从f0出发,预支当前位置被覆盖,得到新的f1 = f0 + x

  • • 旧的f1表示之前某个预支状态,但当前是'0',无法用当前标记兑现,所以被新的预支状态取代。

4. 如果s[i] == '1'

  • • 当前位置有一个初始标记。

  • • 这个标记有两种选择:

  1. 1. 左移到i-1:如果之前对i-1有预支状态,那么现在可以兑现它,总和保持为旧的f1

  2. 2. 留在i:覆盖当前位置,总和从f0增加x,即f0 + x

• 因此新的确定状态取两者最大值:f0 = max(f0 + x, f1)

• 然后f1 += x,表示在预支状态下,当前位置也可以被覆盖,继续把这个预支状态向后传递。

5. 遍历结束后,所有位置都处理完了,不可能再有右边的标记来兑现预支状态,所以最终答案就是确定状态f0

用题目例子nums = [9,2,6,1]s = "0101"模拟:

  • • 初始:f0 = 0f1 = 0

  • i = 0s[0] = '0'x = 9

    • f1 = f0 + 9 = 9

    • f0仍为0

    • • 表示预支下标 0 被右边标记覆盖。

  • i = 1s[1] = '1'x = 2

    • f0 = max(f0 + 2, f1) = max(2, 9) = 9

    • f1 = f1 + 2 = 11

    • • 表示确定下标 0 被覆盖,总和为 9。

  • i = 2s[2] = '0'x = 6

    • f1 = f0 + 6 = 15

    • f0仍为9

    • • 表示在确定下标 0 覆盖的基础上,预支下标 2 被右边标记覆盖。

  • i = 3s[3] = '1'x = 1

    • f0 = max(f0 + 1, f1) = max(10, 15) = 15

    • f1 = f1 + 1 = 16

    • • 最终确定状态为 15。

对应最优操作:
把下标 3 的标记移动到下标 2,把下标 1 的标记移动到下标 0。
最终覆盖下标[0, 2],总和为nums[0] + nums[2] = 9 + 6 = 15

时间复杂度:只遍历一次数组和字符串,每个位置做常数次操作,所以是O(n)
额外空间复杂度:只使用了f0f1等常数个变量,没有额外数组或递归栈,所以是O(1)

Go完整代码如下:

package main

import (
"fmt"
)

func maxTotal(nums []int, s string) int64 {
f0, f1 := 0, 0
for i, x := range nums {
if s[i] == '0' {
f1 = f0 + x
} else {
f0 = max(f0+x, f1)
f1 += x
}
}
return int64(f0)
}

func main() {
nums := []int{9, 2, 6, 1}
s := "0101"
result := maxTotal(nums, s)
fmt.Println(result)
}

Python完整代码如下:

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

def max_total(nums, s):
f0, f1 = 0, 0
for i, x in enumerate(nums):
if s[i] == '0':
f1 = f0 + x
else:
f0 = max(f0 + x, f1)
f1 += x
return f0

if __name__ == "__main__":
nums = [9, 2, 6, 1]
s = "0101"
result = max_total(nums, s)
print(result)

C++完整代码如下:

  




long long maxTotal(const std::vector& nums, const std::string& s) {
long long f0 = 0, f1 = 0;
for (size_t i = 0; i < nums.size(); ++i) {
int x = nums[i];
if (s[i] == '0') {
f1 = f0 + x;
} else {
f0 = std::max(f0 + x, f1);
f1 += x;
}
}
return f0;
}

int main() {
std::vector nums = {9, 2, 6, 1};
std::string s = "0101";
long long result = maxTotal(nums, s);
std::cout << result << std::endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的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.

相关推荐
热点推荐
新赛季大乱斗!9组三巨头,谁会半路翻车?

新赛季大乱斗!9组三巨头,谁会半路翻车?

柚子说球
2026-09-17 20:40:53
这一次,重回中国的樊振东杀疯了,马伊琍也只能心甘情愿当配角

这一次,重回中国的樊振东杀疯了,马伊琍也只能心甘情愿当配角

手工制作阿歼
2026-09-18 01:38:17
他俩是敬一丹弟弟!如今身居高位,手足四人名字细品大有乾坤

他俩是敬一丹弟弟!如今身居高位,手足四人名字细品大有乾坤

九号探秘人
2026-09-17 20:22:35
致敬一丹女儿王尔晴:趁年华尚在生个孩子,或许是最好的怀念

致敬一丹女儿王尔晴:趁年华尚在生个孩子,或许是最好的怀念

虎侃世界
2026-09-15 10:16:06
摊牌了!美国太空部署武器可毁卫星,中国沉寂一天,给出重磅回应

摊牌了!美国太空部署武器可毁卫星,中国沉寂一天,给出重磅回应

旧史新谭
2026-09-17 16:54:09
耿耿于怀!松岛辉空:已拜托日本乒协向WTT投诉,亚运会要夺金牌

耿耿于怀!松岛辉空:已拜托日本乒协向WTT投诉,亚运会要夺金牌

削桐作琴
2026-09-17 19:46:31
男子在游戏中充值100万,急用钱被迫转卖账号,评估后只值8000元

男子在游戏中充值100万,急用钱被迫转卖账号,评估后只值8000元

新游戏大妹子
2026-09-15 13:06:24
调整!中国男篮vs日本比赛时间有变,赛前传来3喜讯一不利

调整!中国男篮vs日本比赛时间有变,赛前传来3喜讯一不利

林子说事
2026-09-17 10:35:29
9月17日,人社部、财政部关于2026年上调退休人员基本养老金的通知正式公布之前,有二十来个省份社保新基数落地,两类人要留心

9月17日,人社部、财政部关于2026年上调退休人员基本养老金的通知正式公布之前,有二十来个省份社保新基数落地,两类人要留心

扶苏聊历史
2026-09-17 09:38:11
特朗普成为美国历史上最腐败的总统!民主党支持率59%

特朗普成为美国历史上最腐败的总统!民主党支持率59%

流逝的颜值
2026-09-17 17:05:59
原来她也送别敬一丹,从央视退休15年,在家带外孙,丈夫是普通人

原来她也送别敬一丹,从央视退休15年,在家带外孙,丈夫是普通人

娱圈办事处
2026-09-17 15:13:05
亚运会之耻!日本盘外招有意针对中国队?张博恒发文怒斥,孙颖莎点评一针见血

亚运会之耻!日本盘外招有意针对中国队?张博恒发文怒斥,孙颖莎点评一针见血

球盲百小易
2026-09-18 02:45:20
对心脏特别好的3种肉,不是牛肉也不是猪肉,常吃血管干净,心跳稳

对心脏特别好的3种肉,不是牛肉也不是猪肉,常吃血管干净,心跳稳

江江食研社
2026-09-15 12:30:18
全网骂翻!陈小春封箱退场被喷耍大牌!揭穿内娱最荒唐的双标现场

全网骂翻!陈小春封箱退场被喷耍大牌!揭穿内娱最荒唐的双标现场

情感大头说说
2026-09-17 09:53:03
成都一网友称携带油纸伞坐地铁被拦下,地铁工作人员回应:属易燃易爆物品,禁止携带进站

成都一网友称携带油纸伞坐地铁被拦下,地铁工作人员回应:属易燃易爆物品,禁止携带进站

扬子晚报
2026-09-17 20:47:16
华为商城“五界”重排,问界从第二掉到最后

华为商城“五界”重排,问界从第二掉到最后

报错免疫体
2026-09-17 14:55:24
戴安娜弟弟新书爆料:查尔斯曾电话里低声说"我们很快就会忘了她"

戴安娜弟弟新书爆料:查尔斯曾电话里低声说"我们很快就会忘了她"

赴一场山海啊
2026-09-17 20:01:04
霍尔木兹海峡,新消息!国际油价,显著下跌

霍尔木兹海峡,新消息!国际油价,显著下跌

扬子晚报
2026-09-17 22:53:06
我问老公,张馨予那么有钱,为什么买一辆15万的车?老公说,不是他们买不起,而是何捷不想让人说闲话。

我问老公,张馨予那么有钱,为什么买一辆15万的车?老公说,不是他们买不起,而是何捷不想让人说闲话。

可读
2026-09-17 22:43:34
中国人口若降到8亿:地铁空了,医院不挤了?养老金压力有多大?

中国人口若降到8亿:地铁空了,医院不挤了?养老金压力有多大?

混沌录
2026-09-17 21:02:22
2026-09-18 05:59:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1462文章数 82关注度
往期回顾 全部

科技要闻

影视飓风Tim反掰iPhoneDuo被质疑

头条要闻

永和豆浆视频被指擦边:女子穿蕾丝吊带 脱黑丝袜洗澡

头条要闻

永和豆浆视频被指擦边:女子穿蕾丝吊带 脱黑丝袜洗澡

体育要闻

逆转朝鲜,国足亚运队“啃老”过关

娱乐要闻

rapper赵涛恋情曝光!带甜馨妈妈散步

财经要闻

缺钱的追觅 隐藏的债务?

汽车要闻

小鹏G9L限时售23.18万 旗舰级的配置/诱人的价格

态度原创

健康
时尚
游戏
教育
艺术

剧烈头痛伴呕吐,警惕脑动脉瘤破裂

潮流之向,自有回响——浪潮音乐大赏特别企划

TES冒泡赛前换教练,小天阿水重回巅峰晋级S16,iG只剩一条命!

教育要闻

江苏又有家长吵着要求取消秋假?其他家长炸锅了!

艺术要闻

一到秋天,南京的秋色就藏不住了

无障碍浏览 进入关怀版