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

算法-二分运算

二分分为整数二分和浮点二分,在整数二分中需要特别注意边界的细节

整数二分-求边界

pair<int, int> binary_search(const vector<int>& num, int target)
{
if (num.empty())
return { -1,-1 };
pair<int, int>ans = { -1,-1 };
int left = 0;
int right = num.size() - 1;
while (left < right)
{
int mid = (left + right) >> 1;
if (num[mid] >= target)
right = mid;
else
left = mid + 1;
}
if (num[left] != target)
return { -1,-1 };
ans.first = left;
left = 0;
right = num.size() - 1;
while (left < right)
{
int mid = (left + right + 1) >> 1;
if (num[mid] <= target)
left = mid;
else
right = mid - 1;
}
ans.second = left;
return ans;
}

需要特别注意,①边界条件是left < right,如果取等会有特别条件报错

②在数列单调递增的时候,左边界应是num[mid] >= target,但是如果是递减就要变成≤

③mid计算的时候是否加一取决于right是等于mid还是不动,如果不动则需要加一(或者理解为left等于mid的时候需要加一)

如果元素至多一个,便会简单很多

int binary_search(const vector<int>& num, int target)
{
int left = 0;
int right = num.size() - 1;
while (left <= right)
{
int mid = (left + right) >> 1;
if (num[mid] > target)
right = mid - 1;
else if (num[mid] == target)
return mid;
else
left = mid + 1;
}
return -1;
}

此时条件直接left <= right即可

浮点二分

double binary_search(double left, double right)
{
double gap = 1e-6;
while (right - left > gap)
{
double mid = (left + right) / 2;
if (check(left))
left = mid;
else
right = mid;
}
return left;
}

具体例子:求平方根

double binary_search(double num)
{
if (num < 0)
return -1;
double gap = 1e-6;
double left = 0;
double right = max(1.0, num);
while (right - left > gap)
{
double mid = (left + right) / 2;
if (mid * mid > num)
right = mid;
else
left = mid;
}
return left;
}

值得注意,gap的取值应该小于题目要求答案精度的1%

http://www.cnnetsun.cn/news/3603247.html

相关文章:

  • 为什么我们需要重新审视数据库管理工具?
  • Tokio TLS 实战:用 rustls 给异步服务加上传输层加密的完整示例
  • WASM 沙箱逃逸的防御:即使攻击者控制了插件,宿主也要能自保的方案
  • 如何从工程思维角度系统评估一支笔的书写体验与可靠性
  • APP闪退问题分析与优化实战指南
  • 2026年独家音乐素材网站TOP5:从检索效率、授权方式到项目适配度全面对比
  • 紧急预警:2024Q2起,YouTube/抖音已启用AI音频指纹识别系统——你的配乐正被实时扫描(附自检工具包)
  • 2026年国外代理IP口碑榜:出海电商与社交媒体运营,优选推荐
  • 卡特加特 AI 营销超算一体机的应用场景?
  • 手机应用安装后图标不显示?全面排查指南
  • Diffusion Model原理与应用:从基础到实践
  • 2026年大模型政策来袭,小白程序员抓住制造业AI落地红利!
  • 智能文档转PPT工具:提升10倍效率的AI演示方案
  • Buck电源模块设计实战:从EMI优化到热管理,加速产品开发
  • 从DRV8662EVM评估板到实战:高压压电驱动电路设计全解析
  • 智能合约钱包开发:EIP-4337与ERC-7715实战解析
  • 2026最新CC-Switch下载安装安装教程|一键切换Claude Code、Gemini CLI、CodexAI工具
  • YOLO13-C3k2-DBB模型在农机零部件检测中的应用与优化
  • VSCode一键安装脚本开发指南
  • 【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
  • 基于深度学习的图片智能分类系统开发实践
  • DOS系统运行ChatGPT的技术实现与优化
  • AI数据可视化从入门到实战:7天掌握动态图表+智能洞察双技能
  • 8bit 优化器 + 梯度检查点 + 极小 batch 什么意思
  • 【体系教程】FVCOM三维水动力、温盐、波浪、泥沙及水质数值模拟全流程实践
  • 鸿蒙 PC Markdown 编辑器外部修改检测:从文件指纹到冲突决策
  • 跨模态智能体技术:架构设计与工程实践
  • 大模型在视频创作工具中的应用:从脚本生成到自动剪辑的AI工具链
  • 深入解析Tiva TM4C123BH6ZRB Flash与EEPROM寄存器级操作
  • 餐饮数字化新基建解析:全链路门店智能运营体系落地实践