C++如何实现二分法


这篇文章主要介绍“C++如何实现二分法”,在日常操作中,相信很多人在C++如何实现二分法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何实现二分法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景:寻找一个数;寻找左侧边界;寻找右侧边界。首先,我们先来分析一下右边界right的初始值:当right=nums.size()时,初始化的区间就变成了 ([0, right-1]),即 ([0,right));当right=nums.size()-1时,初始化的区间就变成了 ([0, right])。在第一种情况下,当nums[mid] > target时,需要将区间向左收缩,即right=mid。这个做法的逻辑是:既然mid位置处大于target,而查找区间又是 “左闭右开”,因此当right=mid时,新的查找区间变成了 ([0, mid)),这样才不会漏掉值。同理,当nums[mid] 时,需要将区间向右收缩,即left = mid+1,因为在 "左闭右开" 的区间下,新的查找区间变成 ([mid+1, right)) 才不会漏掉值。当目标值不在序列中时,需要将while的条件写成while(left 而不是写成while(left,这样会引起数组越界。第二种情况的分析类似,这里只给出结论:当nums[mid] > target时,需要将区间向左收缩,免费云主机域名right=mid-1;当nums[mid] 时,需要将区间向右收缩,即left = mid+1当目标值不在序列中时,需要将while的条件写成while(left在序列中查找一个数,如果存在则返回数的索引,如果不存在则返回-1。为了方便分析,我们就只用第一种情况进行说明:上述代码只能从序列中查找一个目标值并返回位置,当一个序列中目标值不止一个时,我们需要找到目标值最左边的位置和最右边的位置,这时候二分法需要进行改写:根据上述代码,可以发现如果查找目标值的左边界,在满足nums[mid] == target时,需要缩小搜索区间的上界right,在区间 ([left, mid]) 中继续搜索,直到搜索完毕left==right。此时left=right=左边界。查找右边界的做法与左边界类似:注意这里的判断条件改成了当nums[mid] == target时,left = mid+1。因为搜索的区间为 “左闭右开”,所以在寻找左边界时可令right=mid,在寻找右边界时必须另left=mid+1,不然程序会一直停在循环里面而无法跳出循环。到此,关于“C++如何实现二分法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: vue for循环中key的作用是什么

本文小编为大家详细介绍“vue for循环中key的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue for循环中key的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深免费云主机域名入,一起来学习新知识吧。无论是react还是vu…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/10 20:27
下一篇 02/10 20:27

相关推荐