zoukankan      html  css  js  c++  java
  • 二分查找之再思考

    一、一般的二分查找

    一般的二分查找即,输出要查找元素在数组中的位置,这里的位置没有特殊限定,没有要求是数字第一次出现的位置,也没有要求是最后一次出现的位置。

    int getPos(vector<int> A, int n, int val)
    {
        if (A.size()==0)
        {
            return NULL;
        }
        int low=0;
        int high=n-1;
        while(low<=high)    //注意这里是小于等于
        {
            if (A[(low+high)/2]>val)
            {
                high=(low+high)/2-1;
            }
            else if (A[(low+high)/2]<val)
            {
                low=(low+high)/2+1;
            }
            else
                return (low+high)/2;
        }
        return -1;
    }

    image

    二、二分查找之返回数字第一次出现的位置

    由于需要的是第一次的出现的位置,所以代码上要做一点小的改动,如果依然按照一种的代码执行那么结果如下:

    image

    下面对代码做一些修改,修改的思想很简单,首先还是普通的二分查找,找到该元素后退出二分查找,然后以二分查找到的位置遍历向前,直到找到这个数第一次出现的位置就可以了。

    int getPos(vector<int> A, int n, int val)
    {
        if (A.size()==0)
        {
            return NULL;
        }
        int low=0;
        int high=n-1;
        int mid=0;
        bool flag;    //设置一个是否找到的标志
        while(low<=high)    
        {
            mid=(low+high)/2;
            if (A[mid]>val)
            {
                high=mid-1;    
            }
            else if (A[mid]<val)
            {
                low=mid+1;    
            }
            else
            {
                flag=true;    //找到了了,保留找到的位置
                break;
            }
        }
        if (flag)
        {
            while(mid>0&&A[mid-1]==val)    //继续向前遍历,直到第一次出现的位置。
                mid--;
            return mid;
        }
        return -1;
    }

    image

    image

  • 相关阅读:
    【pytest学习10】fixture参数化,fixture(params=data)装饰器的data是函数返回值yield request.param ,将带到下面调用为参数的函数中
    Pipfile 文件转换利器——pipfile-freeze
    npm的lock
    调试wmi连接主机进行监控
    RPC电源监控总结
    HTTP协议三次握手过程
    linux常用命令集
    Gym
    Gym
    实验2.2
  • 原文地址:https://www.cnblogs.com/audi-car/p/4824367.html
Copyright © 2011-2022 走看看