LintCode 题解丨大厂算法面试模板:二分查找

简介: LintCode 题解丨大厂算法面试模板:二分查找

给定一个排序的整数数组(升序)和一个要查找的整数​target​,用​O(logn)​的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回​-1​。

在线评测地址:

LintCode 领扣

样例 1:

输入:[1,4,4,5,7,7,8,9,9,10],1
输出: 0

样例解释:
第一次出现在第0个位置。
样例 2:

输入: [1, 2, 3, 3, 4, 5, 10],3
输出: 2

样例解释:
第一次出现在第2个位置
样例 3:

输入: [1, 2, 3, 3, 4, 5, 10],6
输出: -1

样例解释:
没有出现过6, 返回-1
解题思路

题目提到,给定的数组已经排序,若从小到大遍历数组查找target,则时间复杂度为O(n)O(n),n为数组长度。需要用一个O(logn)O(logn)的时间复杂度去完成本题,那么需要用到二分查找。

二分查找常用于查找有序数组中目标数target的位置,用​left​和​right​记录target所在的区间端点,每次将区间的中间位置值和target作比较,然后移动区间端点。

算法流程

将区间赋值为整个数组区间(left = 0, right = n - 1),取中间位置mid
若​a[mid]​ < target,则将区间缩小到原区间的右区间(left = mid + 1)
若​a[mid]​ >= target,则将区间缩小至原区间的左区间(right = mid)
若left >= right 时,若​a[right]​ = target则返回right, 否则返回-1
复杂度分析

时间复杂度:O(logn)
每次查找都将区间缩小至原来长度的一半,可见查找的最多次数为logn
空间复杂度:O(1)
查找不需要开辟新的非常数级空间,只需在原数组基础上进行查找即可
代码

public class Solution {

/**
 * @param nums: The integer array.
 * @param target: Target to find.
 * @return: The first position of target. Position starts from 0.
 */
public int binarySearch(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    int mid;

    while (left < right) {
        //得到中间位置
        mid = (right + left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }

    if (nums[right] == target) {
        return right;
    }

    return -1;
}

}
更多题解参考:

九章算法 - 帮助更多中国人找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧

相关文章
|
1月前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
27 0
|
1月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
44 0
|
15天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
28天前
|
算法 搜索推荐 Python
数据结构与算法在Python面试中的应用实例
【4月更文挑战第13天】本文聚焦Python面试中的数据结构与算法问题,包括排序算法、链表操作和树图遍历。重点讨论了快速排序、链表反转和二叉树前序遍历的实现,并指出理解算法原理、处理边界条件及递归操作是避免错误的关键。通过实例代码和技巧分享,帮助面试者提升面试表现。
13 0
|
28天前
|
设计模式 算法 Java
如何在面试中应对编程与算法面试?
面试中,编程能力至关重要,主要分为三个层次:初级关注基本功,如语法、原理和常见问题解决;高级涉及数据结构与算法,基础算法如排序对中小厂重要,大厂则需深入数据结构;资深专家层次需精通设计模式,以保证代码的扩展性和维护性。提升编程技能可采用PDCA循环学习法,从计划到执行、检查、行动不断迭代。通过实践项目如开发后端系统、测试框架来检验学习成果,并逐步学习算法和设计模式。坚持不懈的努力和重构将助你成为技术专家。记住,超越大多数人的关键在于持续学习和专注深耕。
7 0
如何在面试中应对编程与算法面试?
|
1月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
2月前
|
存储 移动开发 算法
面试时写不出排序算法?看这篇就够了
面试时写不出排序算法?看这篇就够了
93 0
|
2月前
|
算法 索引
算法思想总结:二分查找算法
算法思想总结:二分查找算法
|
2月前
|
算法
覃超老师 算法面试通关40讲
无论是阿里巴巴、腾讯、百度这些国内一线互联网企业,还是 Google、Facebook、Airbnb 等硅谷知名互联网公司,在招聘工程师的过程中,对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与数据结构相关知识点,学会面试中高频算法题目的分析思路,同时给大家从面试官的角度来分析算法题的解答技巧,从而更有效地提升求职者的面试通过率。
16 3
覃超老师 算法面试通关40讲
|
1天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
13 1