题解 | #二分查找-I#

二分查找-I

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

二分查找

问题描述:请实现无重复数字的升序数组的二分查找。给定一个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
示例1
输入:[-1,0,3,4,6,10,13,14],13
返回值:6
说明:13 出现在nums中并且下标为 6
示例2
输入:[],3
返回值:-1
说明:nums为空,返回-1
示例3
输入:[-1,0,3,4,6,10,13,14],2
返回值:-1
说明:2不在数组中

方法一

思路分析

      本题目思路很清楚,如果不使用二分查找,由于数组是升序,直接从左到右顺序查找,如果找到直接返回所在位置,如果没有返回-1。

C++核心代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int n=nums.size();
        if(n==0) return -1;
        for(int i=0;i<n;i++)
        {
            if(nums[i]==target)//按顺序查找
                return i;
        }
        return -1;//没有找到返回-1
    }
};

复杂度分析

  • 时间复杂度:一层循环遍历,因此时间复杂度为$O(n)$
  • 空间复杂度: 空间复杂度为$O(1)$

方法二

思路分析

     本题是想要考察二分查找的思想。二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找,而本题给的数组是升序的。一个升序数组,比较一个元素与数组中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数组的前半部分进行比较;如果相等,则找到了元素的位置。每次比较的数组长度都会是之前数组的一半,直到找到相等元素的位置或者最终没有找到要找的元素。

图解



C++核心代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int n=nums.size();
        if(n==0) return -1;
        int left=0,right=n-1;
        int mid;
        while(left<=right)
        {
            mid=left+(right-left)/2; //中间位置元素
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]>target)//中间位置元素大于目标值,因此目标值如果在数组中,必在中间位置左侧
                right=mid-1;//设置右侧标志为中间位置-1
            else  //中间位置元素小于目标值,因此目标值如果在数组中,必在中间位置右侧
                left=mid+1;//设置左侧标志为中间位置+1
        }
        return -1;//没有找到返回-1
    }
};

复杂度分析

  • 时间复杂度:每次比较的数组长度都会是之前数组的一半,因此时间复杂度为
  • 空间复杂度: 借助于三个变量,因此空间复杂度为$O(1)$

全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
嵌入式的小白:不错啊,淘天也是挺好的,恭喜
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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