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

做房地产网站建设安徽省最新消息

做房地产网站建设,安徽省最新消息,东欣建设集团网站,西安专业做网站的的公司在算法学习中,二分答案算法是一种非常高效且常用的技巧。它的核心思想是通过不断缩小搜索范围,逐步逼近目标答案。相比传统的暴力搜索,二分答案算法的时间复杂度通常为 O(logn),特别适合处理大规模数据的查找问题。 本文将详细介…

在算法学习中,二分答案算法是一种非常高效且常用的技巧。它的核心思想是通过不断缩小搜索范围,逐步逼近目标答案。相比传统的暴力搜索,二分答案算法的时间复杂度通常为 O(logn),特别适合处理大规模数据的查找问题。

本文将详细介绍二分答案算法的两种常见模板,并结合实际应用场景,帮助你更好地理解和使用这一算法。

二分答案算法的基本原理

二分答案算法的核心思想是:在一个有序的区间中,通过不断将区间分成两部分,判断答案可能存在的那一部分,从而逐步缩小搜索范围,最终找到目标答案

这种算法特别适合以下几种场景:

  1. 寻找符合要求的区间的最大值或最小值:例如,找到一个数组中第一个满足条件的元素。

  2. 寻找最大值的最小值:例如,在分配问题中找到最小的最大分配值。

  3. 寻找最小值的最大值:例如,在优化问题中找到最大的最小值。

这些场景通常难以通过传统的暴力搜索高效解决,而二分答案算法可以轻松应对。

二分答案算法的适用场景

在实际编程中,二分答案算法的应用非常广泛。以下是一些常见的适用场景:

  1. 寻找符合要求的区间的边界

    • 例如,找到一个有序数组中第一个大于等于某个值的元素。

    • 或者找到最后一个小于等于某个值的元素。

  2. 优化问题中的极值查找

    • 例如,在分配问题中,找到最小的最大分配值。

    • 或者在调度问题中,找到最大的最小时间间隔。

  3. 寻找满足条件的最优解

    • 例如,在矩阵中找到满足条件的最小元素。

二分答案算法的两种模板

模板一:查找左边界和右边界

查找左边界 (Search Left, SL)
int SL(int l, int r) {while (l < r) {int mid = l + r >> 1; // 等价于 (l + r) / 2if (check(mid)) r = mid;else l = mid + 1;}return l;
}
查找右边界 (Search Right, SR)
int SR(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1; // 需要 +1 防止死循环if (check(mid)) l = mid;else r = mid - 1;}return r;
}

模板一的特点

  1. 查找左边界

    • mid 的计算方式为 (l + r) / 2

    • 如果 check(mid) 为真,则说明目标可能在左半部分,将右边界 r 更新为 mid

    • 否则,将左边界 l 更新为 mid + 1

  2. 查找右边界

    • mid 的计算方式为 (l + r + 1) / 2,这是为了避免死循环。

    • 如果 check(mid) 为真,则说明目标可能在右半部分,将左边界 l 更新为 mid

    • 否则,将右边界 r 更新为 mid - 1

模板二:另一种实现方式

查找左边界 (Search Left, SL)
int SL(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {r = mid - 1; // 继续在左半部分查找} else {l = mid + 1; // 继续在右半部分查找}}return l;
}
查找右边界 (Search Right, SR)
int SR(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {l = mid + 1; // 继续在右半部分查找} else {r = mid - 1; // 继续在左半部分查找}}return r;
}

模板二的特点

  1. 查找左边界

    • 如果 check(mid) 为真,则说明目标可能在左半部分,将右边界 r 更新为 mid - 1

    • 否则,将左边界 l 更新为 mid + 1

    • 最终返回 l,即左边界。

  2. 查找右边界

    • 如果 check(mid) 为真,则说明目标可能在右半部分,将左边界 l 更新为 mid + 1

    • 否则,将右边界 r 更新为 mid - 1

    • 最终返回 r,即右边界。

模板对比与适用场景

模板一的优点

  • 代码更简洁:逻辑清晰,适合快速实现。

  • 适用于精确查找边界:特别适合需要找到第一个满足条件的元素(左边界)或最后一个满足条件的元素(右边界)。

模板二的优点

  • 更统一:求mid的时候,不用分+1的情况

  • 更直观:容易理解,适合初学者。

  • 适用于范围查找:适合需要找到满足条件的元素范围的边界。

选择模板的建议

  • 如果你需要快速实现并确保代码简洁,可以选择模板一。

  • 如果你需要更直观的逻辑处理和更统一的模板,可以选择模板二。

模版的记忆方法

求左边界则返回L,求右边界则返回R

二分答案算法的实际应用

在实际编程中,二分答案算法的应用非常广泛。以下是一些常见的应用场景和示例:

示例 1:寻找符合要求的区间的最小值

假设你需要在一个有序数组中找到第一个大于等于某个目标值的元素。可以使用模板一的查找左边界方法。

bool check(int mid, int target, vector<int>& arr) {return arr[mid] >= target;
}int findFirstGreaterEqual(int target, vector<int>& arr) {int l = 0, r = arr.size() - 1;return SL(l, r);
}

示例 2:寻找最大值的最小值

例如,在分配问题中,你需要将一组物品分配给若干人,使得每个人分配到的物品总和的最大值最小。可以使用二分答案算法来寻找这个最小的最大值。

bool check(int mid, vector<int>& items, int k) {int cnt = 1, sum = 0;for (int item : items) {sum += item;if (sum > mid) {cnt++;sum = item;}}return cnt <= k;
}int findMinMaxAllocation(vector<int>& items, int k) {int l = *max_element(items.begin(), items.end());int r = accumulate(items.begin(), items.end(), 0);return SL(l, r);
}

示例 3:寻找最小值的最大值

例如,在调度问题中,你需要找到最大的最小时间间隔。可以使用二分答案算法来寻找这个最大的最小值。

bool check(int mid, vector<int>& times) {int cnt = 1, prev = times[0];for (int time : times) {if (time - prev >= mid) {cnt++;prev = time;}}return cnt >= required;
}int findMaxMinInterval(vector<int>& times, int required) {sort(times.begin(), times.end());int l = 0, r = times.back() - times[0];return SR(l, r);
}

总结

二分答案算法是一种非常强大的工具,特别适合解决以下几类问题:

  1. 寻找符合要求的区间的最大值或最小值。

  2. 寻找最大值的最小值。

  3. 寻找最小值的最大值。

通过本文介绍的两种模板,你可以根据具体问题选择合适的实现方式。模板一适合快速实现精确查找,而模板二则更适合处理复杂的边界条件。

希望本文能帮助你更好地理解和使用二分答案算法!如果你有任何问题或建议,欢迎在评论区留言。让我们一起探索算法的无限可能!


文章转载自:

http://sBp8Fhcc.xqxLb.cn
http://P3ZWOGM3.xqxLb.cn
http://9Cno3Qi4.xqxLb.cn
http://n2hgvR5m.xqxLb.cn
http://JmKePJY9.xqxLb.cn
http://VvQjuVxs.xqxLb.cn
http://jnrVfSmd.xqxLb.cn
http://0TkIRagy.xqxLb.cn
http://fnGiojeD.xqxLb.cn
http://lWRoB1SI.xqxLb.cn
http://gcvZJ2zR.xqxLb.cn
http://wgm79Xrn.xqxLb.cn
http://n1prwPrt.xqxLb.cn
http://OPQYvMOI.xqxLb.cn
http://YO0do6fg.xqxLb.cn
http://KngwKu9b.xqxLb.cn
http://ucGn7TIS.xqxLb.cn
http://VhBxhcMo.xqxLb.cn
http://l6OFFIj1.xqxLb.cn
http://6YTnde5R.xqxLb.cn
http://YORyAecM.xqxLb.cn
http://tcKkhs1H.xqxLb.cn
http://4JC6z0Xc.xqxLb.cn
http://9Qy90sWp.xqxLb.cn
http://wxZQtgS2.xqxLb.cn
http://EXodMYoL.xqxLb.cn
http://nsgYLltc.xqxLb.cn
http://OX8RK9uX.xqxLb.cn
http://3hwUBgOd.xqxLb.cn
http://ttapUg6o.xqxLb.cn
http://www.dtcms.com/wzjs/767094.html

相关文章:

  • seo网站标题做网站策划用什么软件
  • 网站代优化网站建设 备案什么意思
  • 产品包装设计网站公路水运建设质量安全监督网站
  • 淘宝客网站制作保定百度seo公司
  • 咨询公司网站源码国家住房和城乡建设部网站查询
  • 百度站长资源平台广州淘宝运营培训
  • 个人网站网址做直播网站软件有哪些
  • 烟台建设网站动漫网站设计
  • 骨干校建设验收网站网站建设公司长春
  • 直播网站开发价格平面设计去哪里学比较好
  • 杭州化工网站建设茶叶网站规划
  • 网站后台怎么传图片企业营销型网站应该有哪些内容
  • 电子商务网站建设产品张艺兴粉丝做的网站
  • 公司网站 开源做pc端网站方案
  • iis7.5配置网站wordpress加字体颜色
  • 免费个人网站模版ps网站建设实习任务完成情况
  • 找人开发软件去什么网站php网站开发自学
  • 济南网站建设选聚搜网络一x昆明网站建设推广服务
  • 山西建设机械网站首页软件工程项目开发流程
  • 龙岩网站制作教程兼职网站建设
  • 什么是营销网站网站建设华网天下公司
  • 全新正版营销网站网站主题包括
  • 泉州建设银行网站平湖手机网站设计
  • 网站建设有哪些工作需需要筹备网店铺装修设计
  • 东莞教育团购网站建设网站会员体系
  • 企业建站系统营销吧tt团队dw做网站字体 别人 电脑
  • 备案 网站名称 重复wordpress入门主题
  • 网站服务器爆满怎么挤进去学网页设计哪个培训学校好
  • 淄博优化网站排名江门免费网站建站模板
  • 怎样弄网站的导航栏app公司开发价格