每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置

来源:互联网 发布:淘宝还能兑换虾米会员 编辑:程序博客网 时间:2024/05/16 07:47

Search Insert Position

原题链接Search Insert Position
这里写图片描述
要求找到目标出现的位置或者应该插入的位置,本质上就是找第一个大于等于目标元素的位置,直接调用lower_bound就解决了。当然也可以自己利用二分法重新实现

class Solution {public:    int searchInsert(vector<int>& nums, int target) {        //auto it = lower_bound(nums.begin(), nums.end(), target);        //return it - nums.begin();        /*          * 如果只有一个元素,会直接返回0         * 如果所有元素都小于target,会返回nums.size() - 1,需要加1         * 所以需要返回后判断一次nums[left]的大小         */        int left = equalLeftBound(nums, target);        if(nums[left] < target)            return left + 1;        else            return left;    }private:    /* 找到第一个出现target的位置 */    int equalLeftBound(vector<int>& nums, int target)    {        int left = 0;        int right = nums.size() - 1;        while(left < right)        {            int middle = (left + right) / 2;            if(nums[middle] < target)                left = middle + 1;            else                right = middle;        }        return left;    }};

First Bad Version

原题链接First Bad Version
这里写图片描述
找到第一个isBadVersion(version)返回true的位置,和上面的一样。不过需要注意的地方是二分法求中点时(left + right) / 2可能会溢出,可以采用left + (right - left) / 2的方式避免溢出

// Forward declaration of isBadVersion API.bool isBadVersion(int version);class Solution {public:    int firstBadVersion(int n) {        return equalLeftBound(n);    }private:    int equalLeftBound(int n)    {        int left = 1;        int right = n;        while(left < right)        {            int middle = left + (right - left) / 2;            bool isBad = isBadVersion(middle);            if(!isBad)                left = middle + 1;            else                right = middle;            /* 加不加都行,因为是左边界,不存在无限循环的问题 */            //if(isBadVersion(left))           //     break;           // else            //    ++left;        }        return left;    }};
阅读全文
0 0
原创粉丝点击