算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

这篇具有很好参考价值的文章主要介绍了算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识!


目录:
1. 开篇例题:704. 二分查找
2. 题解参考(模板写法)

- - 2.1 方法一:左闭右闭写法
- - 2.2 方法二:左闭右开写法

3. 模板解释:左闭右闭

- - 3.1 区间划定
- - 3.2 left 、right 移动问题
- - 3.3 循环条件选择:<=

4. 模板解释:左闭右开

- - 4.1 区间划定
- - 4.2 left 、right 移动问题
- - 4.3 循环条件选择:<
5. 相关题集


1. 开篇例题:704. 二分查找

例题:点击直飞

算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题


2. 题解参考

2.1 方法一:左闭右闭写法
class Solution {
public:
    int search(vector<int>& nums, int target) {
        // 左闭右闭:left:指向首元素,right:指向尾元素;
        int left = 0, right = nums.size()-1;
        // 注意循环条件:<=
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > target ) right = mid - 1;
            else if(nums[mid] < target) left = mid + 1;
            else return mid;
        }
        return -1;
    }
};
2.2 方法二:左闭右开写法
class Solution {
public:
    int search(vector<int>& nums, int target) {
        // 左闭右开:left:指向首元素,right:指向尾元素下一个位置;
        int left = 0, right = nums.size();
        // 注意循环条件:<
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > target ) right = mid;
            else if(nums[mid] < target) left = mid + 1;
            else return mid;
        }
        return -1;
    }
};

3. 模板解释:左闭右闭

3.1 区间划定

左闭右闭:即说的是:left 与 right 的初始值【 两个“指针的指向” 】
左闭右闭:left:指向首元素,right:指向尾元素;(如下图)

算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

3.2 left 、right 移动问题

由于是:左闭右闭区间情形,那么 left 和 right 一定指向顺序表中的某个值!
显然:

  1. right 的移动:若:nums[mid] > target,则说明 target 不在 [mid,right] 区间范围内,此时移动 right,移动方式:right = mid -1;
  2. left 的移动:若:nums[mid] < target,则说明 target 不在 [left,mid] 区间范围内,此时移动 left ,移动方式:left = mid +1;

算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

3.3 循环条件选择:<=

显然,如果:顺序表中只有一个元素:left == right【由区间选择所得】
若 选择: < (非 <= )则:不会进入循环!
无法得到:mid 进行搜索判断!
直接返回结果:-1(未找到!)


4. 模板解释:左闭右开

4.1 区间划定

左闭右开:即说的是:left 与 right 的初始值【 两个“指针的指向” 】
左闭右开:left:指向首元素,right:指向尾元素下一个位置;(如下图)

算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

4.2 left 、right 移动问题

由于是:左闭右开区间情形,那么 left 一定指向顺序表中的某个值!但 right 不会指向任意一个值!
显然:

  1. right 的移动:若:nums[mid] > target,则说明 target 不在 [mid,right) 区间范围内,此时移动 right,移动方式:right = mid;
    难点:mid 在比较过程中,理解右端点移动,mid 指向的若不是目标值,则区间缩减时,mid 已经不存在新区间中了!!!
  2. left 的移动:若:nums[mid] < target,则说明 target 不在 [left,mid] 区间范围内,此时移动 left ,移动方式:left = mid +1;

算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题
算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

4.2 循环条件选择:<

显然,非空顺序表中一定存在:left != right【由区间选择所得】
即至少会进入一个循环:即只有一个元素的情形!
同时:由于 left 若满足合法指向,就一定满足:left < right,不存在 =
因此:选择:<


5. 相关题集

待选中文章来源地址https://www.toymoban.com/news/detail-444337.html

到了这里,关于算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷题营【Day1】:: 27. 移除元素:快慢指针在顺序表中的应用与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:27. 移除元素 2. 题解参考 3. 题解思路 4. 相关题 [ - - 4.1 26. 删除有序数组中的重复项 ] [ - - 4.1 283. 移动零 ] 5. 相关题题解及简要思路 - - 5.1 26. 删除有序数组中的重复项 - - 5.1 283. 移动

    2024年02月06日
    浏览(95)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(57)
  • LeetCode刷题笔记-704.二分查找

     我们定义target在一个左右都是关闭的区间,[left,right] while(left = right) 这里使用= 因为left == right 是有意义的 int mid = left + ((right - left) / 2) 这么写是为了防止溢出 常用操作 当nums[mid] target 将right = mid - 1因为target 不可能在mid处取到 当nums[mid] target 将left = mid + 1

    2024年02月11日
    浏览(55)
  • 【算法】【算法杂谈】旋转数组的二分法查找

    当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 原问题 给定一个从小到大有序的数组,该数组存在重复的数,并且该数组可能经过旋转处理,如arr = [1,2,3,4,5,6,7]代表数组未旋

    2024年02月06日
    浏览(61)
  • 数据结构和算法之二分法查找

    二分法查找,也称作 二分查找 或 折半查找 ,是一种在有序数组中快速查找特定元素的算法。它采用分治法思想,通过将问题划分为规模更小的子问题,并且通过对子问题的查找来解决原问题。 二分法查找的思路是不断地将数组一分为二,然后判断目标值在哪一部分,进而

    2024年02月09日
    浏览(48)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题704、35、34数组二分查找) 2023.4.17

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 数组是由n(n=1)个 相同类型 的数据元素

    2024年02月05日
    浏览(49)
  • 【代码随想录算法第一天| 704.二分查找 27.移除元素】

    题目链接:二分查找 文章讲解:代码随想录.二分查找 视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 二分前提:有序数组,数组中无重复元素 方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左

    2024年02月16日
    浏览(45)
  • 算法刷题营【Day2】:: 双指针算法应用:滑动窗口 :209. 长度最小的子数组

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:209. 长度最小的子数组 2. 题解参考 - - 2.1 方法一:暴力法 - - 2.2 方法二:滑动窗口 3. 方法思路点拨:滑动窗口 - - 3.1 直白解释 - - 3.2 本题思路点拨 4. 相关题集 1. 开篇例题:209. 长度

    2024年02月04日
    浏览(47)
  • 【二分查找】一文带你掌握二分法 (附万能模板)

    一、简介 哪怕没有学过编程的同学,也许不知道二分法这个名字,但也一定接触过它的核心思想。不了解的同学也没关系,我用一句话就能概括出它的精髓: 将一个区间一分为二,每次都舍弃其中的一部分。 二分法能够极大地降低我们在解决问题时的时间复杂度。假如你要

    2024年01月19日
    浏览(58)
  • Leetcode刷题笔记——二分法

    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问。算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将原数组通过[left,right]两个索引划分范围,初值left=0,right=数组的最后一个元素 当left = r

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包