• 准备蓝桥杯的宝贝们看过来,二分法一网打尽(基础篇)


    今天给大家介绍一下简单的二分法(刷题第一步!)

    二分基础题链接

    二分查找有个很明显的特点就是有序,这个特点同学如果在题中看到就要格外注意

    一定要看完,基本的三种解法,后面还有真题链接哦!!

    第一种

    就是最最基础的左闭右闭的区间

    1. class Solution {
    2. public:
    3. int search(vector<int>& nums, int target) {//vector和python里的list有异曲同工之处
    4. int left=0;
    5. int right=nums.size()-1;
    6. //这里也可以用right=sizeof(nums)/sizeof(nums[0]);
    7. while(left<=right)//注意!!!
    8. {
    9. int mid=(right-left)/2+left;
    10. if(nums[mid]>target)
    11. {
    12. right=mid-1;//注意!!!
    13. }
    14. else if(nums[mid]
    15. left=mid+1;//注意!!!
    16. else
    17. return mid;
    18. }
    19. return -1;
    20. }
    21. };

    为什么说它基础,应为你不用考虑right是否合法啊,这样要注意的有如下两点

    1.循环判断时:while(left<=right),这里就有同学问了,why "<=" ? 哈哈哈,因为是此时是[left, right],所以 "left==right"这时候是有意义的。

    2.当判断完满足条件 nums[mid] < target 后,要缩小区间范围了,right此时可以等于 mid-1,因为当满足nums[mid] < target这个条件时,nums[mid] != target这个已经确定,所以right=mid-1;同理left也是,只不过 left=mid+1,大同小异。

    如果大家还有疑惑,我就偷个图让大家看看,哈哈哈

     第二种

    就是和第一种有些许不同的左闭右开区间,可别小看这一个点,把上面两个全改变了!!

    1. class Solution {
    2. public:
    3. int search(vector<int>& nums, int target) {
    4. int left=0;
    5. int right=nums.size();//注意!!!
    6. while(left//注意!!!
    7. {
    8. int mid=(right-left)/2+left;
    9. if(nums[mid]>target)
    10. right=mid; //注意!!!
    11. else if(nums[mid]
    12. left=mid+1;
    13. else
    14. return mid;
    15. }
    16. return -1;
    17. }
    18. };

     这个和上面截然不同的两点

    1.循环判断条件:while (left < right),哈哈哈,这里就有同学恍然大悟,应为现在"left==right",根本就不合法。

    2.判断条件,if (nums[mid] > target) 时,right = mid,因为是开区间,这里如果 right=mid+1,就相当于漏掉了nums[mid+1],原因也是区间右边是开区间,所以现在 right=mid时已经表示了“ target ! = num[mid]”,这里可不能出错哦!

    3.多了个对小白来说,还是要说说,这时 right由于是开区间,所以最开始时,right=nums.size()

    如果有小伙伴还不理解,呢我就只能勉为其难,再偷个图,让大家看看了

     介绍完以上两种,呢就再说一个最简单的吧!

    第三种

    暴力解法:基于二分查找的有序(可能最快,真的!!!)

    由于已经有序,这时从头遍历如果遇到" target==nums[i] ",就" return i ",不就万事大吉了,时间复杂度也是O(n),空间也是O(1) ,如果碰到简单的二分查找完全就不需要搬框架,直接暴力就行

    1. class Solution {
    2. public:
    3. int search(vector<int>& nums, int target) {
    4. int num=nums.size();
    5. for(int i=0;i
    6. {
    7. if(nums[i]==target)
    8. return i;
    9. }
    10. return -1;
    11. }
    12. };

    看完模板就试试上手做点题吧!

    34. 在排序数组中查找元素的第一个和最后一个位置

    35. 搜索插入位置

    69. x 的平方根 

    367. 有效的完全平方数

    大家可以关注我,这两天,会把这四个题尽量用这三种方法更新至博客哦!!

    已更新,写完了——>点这里链接

  • 相关阅读:
    【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计(原理图+源代码+仿真+答辩论文+答辩PPT)
    Matlab:有序分类数组
    现代修谱,如何处理族员离婚再娶,配偶携子改嫁同服弟等情况
    canvas 中如何实现物体的框选(六)
    【LeetCode】94. 二叉树的中序遍历
    jre精简配合java的桌面小工具打包
    antv/x6 自定义html节点并且支持动态更新节点内容
    C++进阶之哈希
    如何实现MQTT协议数据传输?
    虚拟机没网,ping不同外网,ping不通主机,ping不通别的虚拟机
  • 原文地址:https://blog.csdn.net/Zjyzzy123456789/article/details/128060789