news 2026/7/22 19:22:23

3499.操作后最大活跃区段数 I:一次遍历(脑筋急转弯)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3499.操作后最大活跃区段数 I:一次遍历(脑筋急转弯)

【LetMeFly】3499.操作后最大活跃区段数 I:一次遍历(脑筋急转弯)

力扣题目链接:https://leetcode.cn/problems/maximize-active-section-with-trade-i/

给你一个长度为n的二进制字符串s,其中:

  • '1'表示一个活跃区段。
  • '0'表示一个非活跃区段。

你可以执行最多一次操作来最大化s中的活跃区段数量。在一次操作中,你可以:

  • 将一个被'0'包围的连续'1'区块转换为全'0'
  • 然后,将一个被'1'包围的连续'0'区块转换为全'1'

返回在执行最优操作后,s中的最大活跃区段数。

注意:处理时需要在s的两侧加上'1',即t = '1' + s + '1'。这些加上的'1'不会影响最终的计数。

示例 1:

输入:s = "01"

输出:1

解释:

因为没有被'0'包围的'1'区块,因此无法进行有效操作。最大活跃区段数为 1。

示例 2:

输入:s = "0100"

输出:4

解释:

  • 字符串"0100"→ 两端加上'1'后得到"101001"
  • 选择"0100""101001""100001""111111"
  • 最终的字符串去掉两端的'1'后为"1111"。最大活跃区段数为 4。

示例 3:

输入:s = "1000100"

输出:7

解释:

  • 字符串"1000100"→ 两端加上'1'后得到"110001001"
  • 选择"000100""110001001""110000001""111111111"
  • 最终的字符串去掉两端的'1'后为"1111111"。最大活跃区段数为 7。

示例 4:

输入:s = "01010"

输出:4

解释:

  • 字符串"01010"→ 两端加上'1'后得到"1010101"
  • 选择"010""1010101""1000101""1111101"
  • 最终的字符串去掉两端的'1'后为"11110"。最大活跃区段数为 4。

提示:

  • 1 <= n == s.length <= 105
  • s[i]仅包含'0''1'

解题思路:脑筋急转弯

最终求的是1的个数而非连续1的个数,所以我们的目的是把尽可能多的0变成1

首先可以把一段1变成0,这个操作的唯一意义就是把原本不相连的两段0连接起来,然后下一步一起变成1

所以其实这道题最终是把相邻的两段0变成1,然后返回1的个数。也相当于返回原始1的个数加上相邻两段00的个数。

解题方法:一次遍历

回忆一下我们都需要哪些值:

  1. 字符串中原始1的个数,这个可以由一个变量c n t 1 cnt1cnt1在一次遍历后得出。
  2. 字符串中当前区段共计遍历到了多少个0,这个可以由一个变量n o w c n t 0 now_cnt0nowcnt0在遍历过程中维护。当前字符是0的话n o w c n t 0 + 1 now_cnt0+1nowcnt0+1;当前字符是刚刚由01的话,n o w c n t 0 now_cnt0nowcnt00 00
  3. 字符串上一个连续0的个数,这个可以由一个变量l a s t c n t 0 last_cnt0lastcnt0来维护,初始值为无穷小。
  4. 字符串最大两个连续0的个数,这个可以由一个变量m a x 0 max0max0来更新。

这样,我们就可以开始遍历字符串:

  • 如果当前元素是0,则n o w c n t 0 + 1 now_cnt0+1nowcnt0+1
  • 如果当前原始是刚刚由0变成了1,则更新m a x 0 max0max0l a s t c n t 0 last_cnt0lastcnt0n o w c n t 0 now_cnt0nowcnt0

时空复杂度分析

  • 时间复杂度O ( l e n ( s ) ) O(len(s))O(len(s))
  • 空间复杂度O ( 1 ) O(1)O(1)

AC代码

C++

/* * @LastEditTime: 2026-07-21 09:48:29 */classSolution{public:intmaxActiveSectionsAfterTrade(string&s){intcnt1=0,max0=-1000000;for(intlast_cnt0=-1000000,now_cnt0=0,i=0,n=s.size();i<=n;i++){if(i<n&&s[i]=='0'){now_cnt0++;}elseif(i&&s[i-1]=='0'){// 0->1max0=max(max0,last_cnt0+now_cnt0);last_cnt0=now_cnt0;now_cnt0=0;}cnt1+=i<n&&s[i]=='1';}returncnt1+max(max0,0);}};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 19:21:50

Point Transformers开发者指南:Hydra配置系统与模型调参技巧

Point Transformers开发者指南&#xff1a;Hydra配置系统与模型调参技巧 【免费下载链接】Point-Transformers Point Transformers 项目地址: https://gitcode.com/gh_mirrors/po/Point-Transformers Point Transformers是一个基于Transformer架构的点云处理项目&#x…

作者头像 李华
网站建设 2026/7/22 19:18:44

深度学习基础知识

深度学习基础知识回归1. 线性回归2. Softmax回归3. 其他常见回归模型a. 逻辑回归b. 岭回归 和 Lasso回归c. 多项式回归d. 泊松回归e. Cox回归&#xff08;比例风险模型&#xff09;总结与对比回归 1. 线性回归 线性回归是回归问题中最基础、最直观的模型。 核心思想&#xf…

作者头像 李华
网站建设 2026/7/22 19:16:32

排水管网流量监测系统辅助城市运行管理平台调度决策

每到汛期城市内涝、雨水积淹、污水溢流等问题总会牵动大众关注。在不少人的固有认知里&#xff0c;城市排水治理的核心&#xff0c;无非是新增排水管道、扩建排涝泵站这类硬件建设。但事实上&#xff0c;城市地下排水管网体系错综复杂&#xff0c;管线交错、工况多变&#xff0…

作者头像 李华
网站建设 2026/7/22 19:15:51

进阶.bat恶搞代码:让你的整蛊技术再上一层楼

⚠️ 郑重声明&#xff1a;本文所有代码仅供学习交流与虚拟机测试&#xff0c;请勿用于破坏他人设备或非法用途。若因使用不当造成任何后果&#xff0c;本文作者概不负责。 所有脚本均可在重启后恢复正常&#xff0c;但请务必在对方已保存工作的前提下使用。 哈喽&#xff0c;大…

作者头像 李华
网站建设 2026/7/22 19:15:22

灰度发布异常:如何在 5 分钟内回滚止血

一、先把问题边界说清楚 灰度阶段的首要目标是限制影响面&#xff0c;回滚条件必须在发布前定义。很多失败并不是工具本身失效&#xff0c;而是输入、状态、依赖和成功条件没有定义清楚。开始动手前&#xff0c;先写下触发条件、期望结果、允许的副作用和停止条件&#xff0c;这…

作者头像 李华