题解 | #二分查找-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());
    }
};

复杂度分析:

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

全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务