文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言二分查找法怎么用

2023-06-30 05:09

关注

这篇文章主要讲解了“C语言二分查找法怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言二分查找法怎么用”吧!

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4 

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2     
输出: -1        
解释: 2 不存在 nums 中因此返回 -1     

提示:

注意读题,数组为有序数组,且数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

在二分查找的过程中,保持不变量,就是在 while 寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即 [left, right],或者左闭右开即 [left, right)。

第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。因为定义 target 在 [left, right] 区间,所以有如下两点:

while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=

if (nums[middle] > target) ,right 要赋值为 middle - 1,因为当前这个 nums[middle] 一定不是 target ,那么接下来要查找的左区间结束下标位置就是 middle - 1

// 版本一class Solution {public:    int search(vector<int>& nums, int target) {        int left = 0;        int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]        while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=            int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2            if (nums[middle] > target) {                right = middle - 1; // target 在左区间,所以[left, middle - 1]            } else if (nums[middle] < target) {                left = middle + 1; // target 在右区间,所以[middle + 1, right]            } else { // nums[middle] == target                return middle; // 数组中找到目标值,直接返回下标            }        }        // 未找到目标值        return -1;    }};

如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。

有如下两点:

while (left < right),这里使用 < ,因为 left == right 在区间 [left, right) 是没有意义的

if (nums[middle] > target) ,right 更新为 middle,因为当前 nums[middle] 不等于 target,去左区间继续寻找,而寻找区间是左闭右开区间,所以 right 更新为 middle,即:下一个查询区间不会去比较 nums[middle]

// 版本二class Solution {public:    int search(vector<int>& nums, int target) {        int left = 0;        int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)        while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <            int middle = left + ((right - left) >> 1);            if (nums[middle] > target) {                right = middle; // target 在左区间,在[left, middle)中            } else if (nums[middle] < target) {                left = middle + 1; // target 在右区间,在[middle + 1, right)中            } else { // nums[middle] == target                return middle; // 数组中找到目标值,直接返回下标            }        }        // 未找到目标值        return -1;    }};

通过以上两种方法,要注意它们不同的地方:

① right 的初始值不一样

② 左右区间的更新值的差别

感谢各位的阅读,以上就是“C语言二分查找法怎么用”的内容了,经过本文的学习后,相信大家对C语言二分查找法怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯