news 2026/7/23 14:29:25

算法-二分运算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法-二分运算

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

整数二分-求边界

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%

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

为什么我们需要重新审视数据库管理工具?

为什么我们需要重新审视数据库管理工具&#xff1f; 在软件开发的早期阶段&#xff0c;数据库管理工具往往被看作是简单的“增删改查”界面——只要能连上数据库、执行SQL、查看结果就够了。但随着云原生架构、微服务、数据湖、实时分析等新范式的兴起&#xff0c;传统数据库管…

作者头像 李华
网站建设 2026/7/23 14:22:42

Tokio TLS 实战:用 rustls 给异步服务加上传输层加密的完整示例

Tokio TLS 实战&#xff1a;用 rustls 给异步服务加上传输层加密的完整示例 一、TLS 握手流程速览&#xff1a;先搞清楚在做什么 在撸代码之前&#xff0c;快速回顾一下 TLS 1.3 的握手过程。很多人搞不清楚这些概念就开始配&#xff0c;结果配错了都不知道。 为什么选 rust…

作者头像 李华
网站建设 2026/7/23 14:20:42

如何从工程思维角度系统评估一支笔的书写体验与可靠性

你有没有过这样的经历&#xff1a;买了一支新笔&#xff0c;满心期待地打开包装&#xff0c;结果写起来不是断墨就是刮纸&#xff0c;用不了几天就想扔进抽屉角落。或者反过来&#xff0c;偶然拿到一支不起眼的笔&#xff0c;却发现它出墨流畅、握感舒适&#xff0c;从此再也离…

作者头像 李华
网站建设 2026/7/23 14:19:55

APP闪退问题分析与优化实战指南

1. 为什么新APP上线首周闪退问题频发&#xff1f; 刚上线的APP遭遇"闪退"和"打不开"差评&#xff0c;这几乎是每个开发团队都会经历的噩梦。根据行业数据统计&#xff0c;约78%的新应用在上线第一周会收到此类负面反馈。究其原因&#xff0c;主要存在以下几…

作者头像 李华