专栏:50多种数据结构彻底征服 专栏:50多种经典图论算法全部掌握 有消息称字节跳动以4-2的职级和8位数的年包工资挖走原阿里通义大模型技术负责人周畅。周畅于2017年入职阿里,曾担任阿里通义大模型技术负责人。去年7月周畅离职后,已于8月加入字节,从事AI大模型相关工作。 据第一财经报道称,“来字节的不止周畅一个人,他手底下的团队还有十多个人也跟着跳槽了。”字节给周畅提供了一份几乎无法拒绝的合同:4-2的职级和8位数的年包工资,按阿里的职级体系换算大约是连跳两级且薪资翻好几倍。与他一起来的原团队成员,字节也都给了4-1、3-2(对标阿里级别P10、P9)的职级。 --------------下面是今天的算法题-------------- 来看下今天的算法题,这题是LeetCode的第35题:搜索插入位置。 问题描述 来源:LeetCode第35题 难度:简单 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例2: 输入: nums = [1,3,5,6], target = 2 输出: 1
问题分析 这题让查找目标值在数组中的位置,如果没找到就返回目标值应该插入的位置,这是一道典型的二分查找题。对于二分查找可以使用 左闭右闭 和 左闭右开 两种方式,无论哪种方式都要注意防止出现死循环。 防止出现死循环的判断也比较简单,就是无论是开区间还是闭区间, 每次 while 循环的时候,两个指针必须要有一个指针的值发生改变 。我们这里就以 左闭右开 区间来分析下,解题步骤如下: 1,使用两个指针一个指向查询区域的左端 left ,一个指向查询区域右端的下一个位置 right ,每次取区域内 [left,right) 中间位置的值。 2,如果目标值等于中间值,说明找到了,直接返回 mid 。 3,如果目标值大于中间值,说明中间值及前面部分太小了,下一步需要往后半部分查找 [mid+1,right) 。 4,如果目标值小于中间值,说明中间值及后面部分太大了,但中间值有可能是需要插入的位置,所以中间值的位置不能排除,下一步需要往前半部分查找 [left,mid) 。 因为 right 是开区间,当 left >= right 的时候说明查询区间为空,终止循环,所以循环执行的条件是 left < right 。 JAVA:
C++:
Python:
笔者简介 博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。 |