题解 | #二分查找-I#

二分查找-I

http://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

题意整理:

题意已经非常明显,既书写一个对不存在重复元素的排序数组的二分查找
二分查找既利用数组排序特性的一种高效查找算法,一次可以去除一半的待查找元素,所以时间复杂度为

方法一:书写简单二分

核心思想:

采用双指针的方法,左指针开始时指向数组头部,右指针开始时指向数组尾部,每次都对两指针中间值与目标值对比,根据大小特性进行指针调整,当mid对应值等于目标值,返回答案;当mid对应值大于目标值,说明mid及其右侧元素不满足,令右指针指向mid左侧;同理当mid对应值小于目标值,令左指针指向mid右侧。当两根指针交错时,说明不存在目标元素。
图片说明

核心代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1, mid = 0;
        while(left <= right) {
            mid = (left + right) / 2;//取中间点
            if(nums[mid] == target) {
                //找到了答案
                return mid;
            } else if(nums[mid] > target) {
                //此时mid右侧元素不满足
                right = mid - 1;
            } else {
                //此时mid左侧元素不满足
                left = mid + 1;
            }
        }
        return -1;
    }
};

复杂度分析:

时间复杂度:,每次都排除一半的元素,故复杂度为
空间复杂度:,只使用了常数个变量

方法二:使用STL提供的二分查找

核心思想:

STL提供了lower_bound()函数,当查找元素存在时,该函数返回其第一个出现的位置,否则返回其可以正确插入的位置。所以只需要对返回位置的值与目标值进行对比就可以确认目标值是否出现。

核心代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size() == 0) {
            return -1;
        }
        auto it = lower_bound(nums.begin(),nums.end(),target);
        if(*it != target){
            //此时不存在元素,返回的是可以插入的位置
            return -1;
        }
        return (it - nums.begin());
    }
};

复杂度分析:

时间复杂度:,该函数时间复杂度为
空间复杂度:,该函数空间复杂度为

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务