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

【C++前缀和】2222. 选择建筑的方案数|1656

本文涉及的基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

LeetCode2222. 选择建筑的方案数

难度分:1656
给你一个下标从 0 开始的二进制字符串 s ,它表示一条街沿途的建筑类型,其中:
s[i] = ‘0’ 表示第 i 栋建筑是一栋办公楼,
s[i] = ‘1’ 表示第 i 栋建筑是一间餐厅。
作为市政厅的官员,你需要随机 选择 3 栋建筑。然而,为了确保多样性,选出来的 3 栋建筑 相邻 的两栋不能是同一类型。
比方说,给你 s = “001101” ,我们不能选择第 1 ,3 和 5 栋建筑,因为得到的子序列是 “011” ,有相邻两栋建筑是同一类型,所以 不合 题意。
请你返回可以选择 3 栋建筑的 有效方案数 。
示例 1:
输入:s = “001101”
输出:6
解释:
以下下标集合是合法的:

  • [0,2,4] ,从 “001101” 得到 “010”
  • [0,3,4] ,从 “001101” 得到 “010”
  • [1,2,4] ,从 “001101” 得到 “010”
  • [1,3,4] ,从 “001101” 得到 “010”
  • [2,4,5] ,从 “001101” 得到 “101”
  • [3,4,5] ,从 “001101” 得到 “101”
    没有别的合法选择,所以总共有 6 种方法。
    示例 2:
    输入:s = “11100”
    输出:0
    解释:没有任何符合题意的选择。
    提示:
    3 <= s.length <= 105
    s[i] 要么是 ‘0’ ,要么是 ‘1’ 。

C++前缀和

只有两种选法:010 和101。
preSum[0][i]记录前i间建筑中为0的数量,preSum[1][i]记录前i间建筑物中1的数量。
从小到大枚举i ∈ \in [1,n-1)
如果nums[i]是1:
nums[0…i)中0的数量 × \times × nums[i+1,…]中0的数量
如果nums[i]是0:
nums[0…i)中1的数量 × \times × nums[i+1,…]中1的数量

代码

核心代码

	class Solution {public:long long numberOfWays(string s) {vector<vector<long long>> preSum(2,vector<long long>(1));for (const auto& ch : s) {preSum[0].emplace_back(preSum[0].back() + ('0' == ch));preSum[1].emplace_back(preSum[1].back() + ('1' == ch));}long long ret = 0;for (int i = 1; i + 1 < s.length(); i++) {const auto& ps = preSum['0' == s[i]];					ret += ps[i] * (ps.back() - ps[i + 1]);}return ret;}};

单元测试

string s;TEST_METHOD(TestMethod11){s = "001101";auto res = Solution().numberOfWays(s);AssertEx(6LL, res);}TEST_METHOD(TestMethod12){s = "11100";auto res = Solution().numberOfWays(s);AssertEx(0LL, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.mrgr.cn/news/30724.html

相关文章:

  • Word VBA如何间隔选中多个(非连续)段落
  • 【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用
  • 学习日志010--python异常处理机制与简单文件操作
  • idea 删除本地分支后,弹窗 delete tracked brank
  • 前端神经网络入门(三):深度学习与机器学习的关系、区别及核心理论支撑 - 以Brain.js示例
  • 【3D Slicer】的小白入门使用指南四
  • U-Boot的基本使用
  • react hooks--useMemo
  • Flask 第十二课 -- 错误处理
  • 基于SpringBoot的图书进销存管理系统【附源码】
  • AutoGen Function Call 函数调用解析(二)
  • 数据库面试题整理
  • Ubuntu安装MySQL过程中没有出现设置root和密码的步骤导致无法root登入解决办法
  • <<编码>> 第 14 章 反馈与触发器(7)--分频器与计数器 示例电路
  • 上海AI气象大模型提前6天预测“贝碧嘉”台风登陆浦东 今年已多次精准预测
  • 工作烦恼与吐槽
  • 吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
  • Ubuntu初期配置常见问题汇总
  • 华为OD机试 - 构成指定长度字符串的个数(Python/JS/C/C++ 2024 E卷 100分)
  • WEB攻防-JS项目Node.js框架安全识别审计验证绕过
  • 修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
  • EmguCV学习笔记 VB.Net 12.3 OCR
  • C++--C++11
  • 单细胞BisqueRNA和BayesPrism去卷积分析工具简单比较
  • ffmpeg面向对象——参数配置秘密探索及其设计模式
  • 【编程底层原理】mysql的redo log undo log bin log日志的作用,以及何时生成,涉及到哪些参数变量