2026-04-29:二进制交换后的最大分数。用go语言,给定一个长度为 n 的整数数组 nums 和一个长度相同的二进制字符串 s。 初始得分为 0。对于字符串中每个位置上字符为 ‘1‘ 的下标 i
2026-04-29二进制交换后的最大分数。用go语言给定一个长度为 n 的整数数组 nums 和一个长度相同的二进制字符串 s。初始得分为 0。对于字符串中每个位置上字符为 ‘1’ 的下标 i分数都会加上 nums[i]。你可以进行任意次操作也可以一次都不做。每次操作时可以选择一个位置 i0 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。解题过程详细解析先明确核心规则初始分数所有s中为1的位置直接加对应nums值允许操作只能交换相邻的0和1要求左边是0、右边是1可以交换任意次本质1可以向左移动到任意0的位置因为多次相邻交换能让1持续左移我们的目标是让1停在数值最大的位置上最大化总分。输入示例nums [2, 1, 5, 2, 3]s 0 1 0 1 0下标0~4初始s中1的位置下标1、下标3。一、整体解题思路我们从右向左遍历数组从最后一个元素往第一个元素走配合最小堆实现最优选择最小堆的作用存储当前已选中的1对应的数值堆顶永远是最小的那个数遍历规则遇到s[i]1必须选这个位置数值加入总分同时放入最小堆遇到s[i]0这个位置可以放一个1因为1能左移过来如果当前位置的数值 堆里最小的数就替换用更大的数替换堆里最小的数总分也同步更新只加差值最终堆里保留的就是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数值3s‘0’当前堆为空没有可以替换的数不做任何操作。步骤2遍历下标3数值2s‘1’这是必须选的1总分 2当前总分2把数值2放入最小堆堆[2]堆顶是2。步骤3遍历下标2数值5s‘0’这是0的位置可以放1比较当前数5 堆顶最小值2执行替换总分 5-2 3总分235用5替换堆顶的2堆调整为[5]堆顶是5。步骤4遍历下标1数值1s‘1’这是必须选的1总分 1当前总分516把数值1放入最小堆堆[1,5]堆顶是最小的1。步骤5遍历下标0数值2s‘0’这是0的位置可以放1比较当前数2 堆顶最小值1执行替换总分 2-11总分617用2替换堆顶的1堆调整为[2,5]堆顶是2。三、最终结果遍历结束总分7和题目示例输出完全一致。最终选中的两个位置下标02、下标25总和257。四、复杂度分析1. 时间复杂度遍历数组O(n)n是数组长度每个元素仅遍历一次堆操作每个元素最多入堆、出堆、调整堆各一次堆的大小最大为k原1的个数单次堆操作O(logk)总时间复杂度O(n log n)logk ≤ logn是最优可接受复杂度。2. 额外空间复杂度仅使用了一个最小堆存储元素堆的最大空间为k原1的个数总额外空间复杂度O(n)最坏情况全是1堆大小为n。总结核心逻辑从右向左遍历用最小堆动态保留最大的k个数值k原1的数量操作本质利用规则让1左移替换掉更小的数值实现分数最大化复杂度时间O(n log n)空间O(n)能高效处理n≤1e5的大数据量。Go完整代码如下packagemainimport(container/heapfmtsort)funcmaximumScore(nums[]int,sstring)(ansint64){h:hp{}// Traverse from the end to the beginningfori:len(nums)-1;i0;i--{x:nums[i]ifs[i]1{ansint64(x)heap.Push(h,x)}elseifh.Len()0xh.IntSlice[0]{ansint64(x-h.IntSlice[0])h.IntSlice[0]x heap.Fix(h,0)}}return}typehpstruct{sort.IntSlice}func(h*hp)Push(v any){h.IntSliceappend(h.IntSlice,v.(int))}func(hp)Pop()(_any){return}funcmain(){nums:[]int{2,1,5,2,3}s:01010result:maximumScore(nums,s)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-importheapqdefmaximumScore(nums,s):ans0h[]# min heap# Traverse from the end to the beginningforiinrange(len(nums)-1,-1,-1):xnums[i]ifs[i]1:ansx heapq.heappush(h,x)elifhandxh[0]:ansx-h[0]heapq.heapreplace(h,x)# pop smallest and push xreturnansdefmain():nums[2,1,5,2,3]s01010resultmaximumScore(nums,s)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevector#includestring#includequeue#includealgorithmusingnamespacestd;longlongmaximumScore(vectorintnums,string s){longlongans0;// Min heap using greaterintpriority_queueint,vectorint,greaterintpq;// Traverse from the end to the beginningfor(intinums.size()-1;i0;i--){intxnums[i];if(s[i]1){ansx;pq.push(x);}elseif(!pq.empty()xpq.top()){ansx-pq.top();pq.pop();pq.push(x);}}returnans;}intmain(){vectorintnums{2,1,5,2,3};string s01010;longlongresultmaximumScore(nums,s);coutresultendl;return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564797.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!