优何软件 首页 软件资讯 其他 查看内容

字节8位数年薪,挖走阿里大模型关键技术负责人,阿里申请仲裁。 ...

2025-2-21 11:11| 来自: 优何整理| 发布者: 数码小编

专栏: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

  • 1 <= nums.length <= 10^4

  • -10^4 <= nums[i] <= 10^4

  • nums 为无重复元素的升序排列数组

  • -10^4 <= target <= 10^4

问题分析

这题让查找目标值在数组中的位置,如果没找到就返回目标值应该插入的位置,这是一道典型的二分查找题。对于二分查找可以使用 左闭右闭 和 左闭右开 两种方式,无论哪种方式都要注意防止出现死循环。

防止出现死循环的判断也比较简单,就是无论是开区间还是闭区间, 每次 while 循环的时候,两个指针必须要有一个指针的值发生改变 。我们这里就以 左闭右开 区间来分析下,解题步骤如下:

1,使用两个指针一个指向查询区域的左端 left ,一个指向查询区域右端的下一个位置 right ,每次取区域内 [left,right) 中间位置的值。

2,如果目标值等于中间值,说明找到了,直接返回 mid 。

3,如果目标值大于中间值,说明中间值及前面部分太小了,下一步需要往后半部分查找 [mid+1,right) 。

4,如果目标值小于中间值,说明中间值及后面部分太大了,但中间值有可能是需要插入的位置,所以中间值的位置不能排除,下一步需要往前半部分查找 [left,mid) 。

因为 right 是开区间,当 left >= right 的时候说明查询区间为空,终止循环,所以循环执行的条件是 left < right 。


JAVA:

public int searchInsert(int[] nums, int target) {     int left = 0;// 左边界,闭区间。     int right = nums.length;// 右边界,开区间。     while (left < right) {         int mid = (left + right) >>> 1;// 中间值。         if (nums[mid] == target)             return mid;         else if (nums[mid] < target) {             left = mid + 1; // 缩小范围到[mid+1,right]         } else {// if (nums[mid] > target)             right = mid;  // 缩小范围到[left,mid)         }     }     return right;// 或者return left; }

C++:

public:     int searchInsert(vector

 & nums, int target) {         int left = 0;// 左边界,闭区间。         int right = nums.size();// 右边界,开区间。         while (left < right) {             int mid = left + (right-left)/2 ;// 中间值。             if (nums[mid] == target)                 return mid;             else if (nums[mid] < target) {                 left = mid + 1; // 缩小范围到[mid+1,right]             } else {// if (nums[mid] > target)                 right = mid;  // 缩小范围到[left,mid)             }         }         return right;// 或者return left;     }

Python:

def searchInsert(self, nums: List[int], target: int) -> int:     left, right = 0, len(nums)     while left < right:         mid = (left + right) // 2         if nums[mid] == target:             return mid         elif nums[mid] < target:             left = mid + 1  # 缩小范围到[mid+1, right]         else:  # if (nums[mid] > target)             right = mid  # 缩小范围到[left, mid)     return right

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。


路过

雷人

握手

鲜花

鸡蛋

最新评论