当前位置: 首页 > news >正文

LeetCode3666:使二进制字符串全为1的最小操作次数

image

看灵神题解看半天,看的脑壳疼。不知道是不是完全理解了。

总体来说是使用BFS来从起点状态,枚举一次操作后可能出现的下一个状态。再由下一层的状态继续枚举。直到所有的节点都被访问过。如果该办法不进行优化,单单是BFS的话,意味着每次判断区间节点是否被访问过,都要完整遍历可取的状态区间一次,时间复杂度就到了\(O(NK)\),其中\(K\)为区间长度。

如果使用有序集合的话,可以将访问过的状态弹出,这样每次寻找到都直接是未经访问过的状态,大大节省了时间。然而这还不是最优的,因为你仍然需要去判断这些未访问的区间中的状态,哪些是下一次可能访问到的,哪些不是。

因为本题的特殊性质,可以使用两个有序集合进一步把区间中未访问的部分二分,将当前的状态与下一步访问的集合一一对应。直接从对应的集合中获取区间中的状态即可,无需额外判断。这保证了每个状态/节点,只会被访问常数次,从而将时间复杂度压缩到了\(O(nlogn)\),其中\(logn\)是有序集合的维护开销。

BFS+有序集合

本题目中支持双有序集合的点在于从当前状态出发,其下一个访问的状态的性质是可以提前预知的。

假设二进制串总长度为 \(n\) ,其中 \(0\) 的数目是 \(z\)\(1\) 的数目是即是 \(n-z\) 。选择翻转时,选择翻转 \(0\) 的数目是 \(x\) ,那么被翻转的 \(1\) 的数目即是 \(k-x\) 。那么进行一次翻转操作后\(0\)的数目更新为:\(z=z+(k-x)-x=z+k-2x\) 。这个式子决定了为什么能使用双有序集合。如果将更新后的 \(z\)\(2\) 进行取模。很容易发现其值由 \(z+k\) 决定,与 \(x\) 无关。也就是不论本次选择翻转多少,下一次 \(z\) 的状态必为奇或偶而不可能混带奇和偶。因此可以分别使用两个有序集合,一个维护奇,一个维护偶。

奇偶确定了,选择的集合也就确定了。还需要知道的是,下一个状态是集合中的哪个区间。对于\(z=z+k-2x\)更新公式而言,唯一的变量就是\(x\)\(x\)的范围决定了选取的范围。对于\(x\),其首先不能超过上限 \(z\) ,其次不允许超过允许翻转的数目 \(k\) ,下限不能低于\(0\)。除此之外\(1\)的数目也不能超过整体 \(1\) 的数目,有约束 \(k-x\)<=\(n-z\) 。综合以上,\(x\in [max(k,z),min(0,k+z-n)]\) 。剩下的问题就很简单了。使用BFS逐层枚举即可。

class Solution:def minOperations(self, s: str, k: int) -> int:n = len(s)# 一个存储奇状态,一个存偶状态not_vis = [SortedList(range(0,n+1,2)),SortedList(range(1,n+1,2))]# 避免后续需要判断idx不存在以及循环越界问题not_vis[0].add(n+1)not_vis[1].add(n+1)start=s.count('0') # 起始状态# 从未访问中去除startnot_vis[start%2].discard(start)# 以下为BFS带深度的写法,因为本题深度即是答案,这样写方便q=[start]ans=0while q:tmp=qq=[]for z in tmp:if z==0:return ansmn=z+k-2*min(k,z)mx=z+k-2*max(0,k-n+z)# 只可能翻转到与mn奇偶相同的位置sl=not_vis[mn%2]# 二分查找能够达到的状态idx=sl.bisect_left(mn)while sl[idx] <= mx:j = sl.pop(idx)q.append(j)# 维护深度ans+=1 return -1
http://www.jsqmd.com/news/417842/

相关文章:

  • 2026年河南冷库保养服务商5强名单出炉,权威报告揭示一站式 - 精选优质企业推荐榜
  • 推荐一个微服务视频教程,用到了 Redis MQ ES
  • 少走弯路:10个AI论文写作软件测评!本科生毕业论文+开题报告必备工具推荐
  • 国产VS进口:氨气分析仪/氨气浓度分析仪品牌大盘点,到底谁更靠谱? - 品牌推荐大师1
  • python导入redis json数据,通过接口的方式
  • 储能海外营销代运营公司怎么选?上海、苏州B2B出海+社媒代运营服务商汇总 - 品牌2025
  • 导师严选!备受追捧的AI论文写作软件 —— 千笔·专业学术智能体
  • 2026年 东莞腊味/广东腊味厂家推荐排行榜:匠心传承与地道风味口碑之选 - 品牌企业推荐师(官方)
  • 企业级IT运维最佳实践:如何构建高效的软件资产与许可管控体系
  • 直接上结论:10个降AI率网站测评!专科生必看的降AI率工具推荐
  • 2026年河南冷库质量保障TOP5名单出炉,权威机构发布最新 - 精选优质企业推荐榜
  • 2026年天然肉桂醛及衍生品厂家推荐:武汉能迈科香料有限公司,全系肉桂产品供应 - 品牌推荐官
  • 海外品牌营销推广优选,海外整合营销公司+外贸B2B营销获客公司出海攻略 - 品牌2025
  • github如何下载软件包
  • python3安装及python redis安装
  • 2026年四川省综合布线厂家推荐榜 实力企业TOP4甄选 - 深度智识库
  • LinkedIn营销服务商怎么选?机械设备外贸B2B营销公司+汽车配件海外营销代运营服务商指南 - 品牌2025
  • EchoKitxOceanBaseseekdb:开源的本地化语音AI框架
  • 2026年 模块化机房/精密配电柜/一体化机柜/精密空调厂家推荐榜单:智能高效与稳定可靠的数据中心核心设备深度解析 - 品牌企业推荐师(官方)
  • Hashcat 无显卡服务器 (CPU 模式) 部署方案
  • 2026年情感与少儿心理咨询机构选型指南:如何为家庭成长找到可靠伙伴 - 品牌推荐官
  • 所有人年度生活数字总结报告,比平台总结更走心。
  • 新手也能上手 AI论文写作软件,千笔写作工具 VS WPS AI,研究生专属神器!
  • 2026 年全国扫地机厂家哪家好? 口碑品牌适配不同用户需求 优质品牌技术与服务全景解析 - 深度智识库
  • 2026年电池材料/超细/废旧电池/小苏打/超微粉碎机推荐:潍坊帕尔曼粉体设备全系解决方案 - 品牌推荐官
  • 学长亲荐 8个降AI率工具:本科生必看的降AI率测评与推荐
  • 2026环保艺术涂料热销榜:品质之选,打造健康居住环境,家装艺术漆/微晶石艺术漆/艺术涂料,环保艺术涂料实力厂家哪家强 - 品牌推荐师
  • 护网行动红蓝对抗实战复盘:红队突破技巧+蓝队防御避坑,直接套用
  • 实测才敢推!千笔,人气爆表的AI论文软件
  • 计算机毕业设计之基于SpringBoot技术的教学辅助平台的设计与实现