大家好,我是苍何。
在脉脉上看到这条热搜感觉挺有意思的,正直找工作季节,觉得有必要给大家分享一下。
美团为啥一直被人称为开水团呢?
这是因为美团的福利,据说从来就只有办公区的白开水😂。
但现在据爆料,美团福利上新了,开水团的优惠不再只有开水了。
开水团这两天在内部上线了两项面向员工的专属优惠:
1、推出 5 折员工单车骑行卡,开水团员工骑小单车直接五折。
2、员工每个月只需要花费 1 块钱就可领取价值 100 元的「神会员」省钱包。
虽说加糖力度一般,但总比天天免费的白开水来的实在些。
我觉得大厂完全可以将自己的产品让利给自家员工,比如 QQ 音乐就直接送会员,王者荣耀就直接送皮肤,饿了么就直接送外卖券,京东就直接送 plus 会员。。。
这也算是薪资外的一份福利吧,对加强企业归属感还是蛮重要的。
另外美团这两天也开奖了,北京后端开发岗,base 给到 23 -25 K。
好啦,关于开水团福利上新这事,你怎么看?欢迎评论区讨论。
...
回归主题。
今天来一道华为鸿蒙开发考过的一道面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:33
题目名称:搜索旋转排序数组
在一个升序排列的整数数组 nums
中,每个数的值互不相同。假设在某个未知的下标 k
处对数组进行了旋转,使得数组从 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
的形式排列。
例如,给定数组 [0,1,2,4,5,6,7]
在下标 k=3
处旋转后,可能变为 [4,5,6,7,0,1,2]
。
给定这样的一个旋转后的数组 nums
和一个目标值 target
,如果 nums
中存在该目标值 target
,返回它的下标;否则,返回 -1。
要求算法的时间复杂度必须为 O(log n)
。
示例
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
示例 3:
输入: nums = [1], target = 0
输出: -1
提示
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
数组中的每个值互不相同
-10^4 <= target <= 10^4
解题思路
由于数组被旋转过,但整体上仍然是部分有序的,因此可以通过二分查找法来实现 O(log n)
的时间复杂度。二分查找的核心在于每次判断中点的两边哪一侧是有序的,进而确定目标值 target
的可能位置范围。
初始化两个指针
left
和right
,分别指向数组的开头和末尾。计算中间位置
mid
,判断nums[mid]
是否等于target
,如果相等则直接返回mid
。如果
nums[left]
到nums[mid]
有序:
检查
target
是否在nums[left]
到nums[mid]
之间。如果在此区间,则更新
right
,否则更新left
。
如果 nums[mid]
到 nums[right]
有序:
检查
target
是否在nums[mid]
到nums[right]
之间。如果在此区间,则更新
left
,否则更新right
。
重复上述过程,直到找到目标或指针交错。
如果循环结束后没有找到目标,返回 -1。
代码实现
Java 代码
public class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
// 判断左半部分是否有序
if (nums[left] <= nums[mid]) {
// target 在左半部分范围内
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
// 右半部分有序
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
}
C++代码
#include <vector>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
// 左半部分有序
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else { // 右半部分有序
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
};
Python 代码
from typing import List
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
# 左半部分有序
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
# 右半部分有序
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
复杂度分析
时间复杂度:
O(log n)
,由于我们每次都将搜索范围缩小一半。空间复杂度:
O(1)
,只使用了常数空间。
ending
你好呀,我是苍何。是一个每天都在给自家仙人掌讲哲学的执着青年,我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功。共勉 💪
点击关注下方账号,你将感受到一个朋克的灵魂,且每篇文章都有惊喜。
感谢大家一直以来的阅读、在看和转发,我会把流量主收益都用来发红包,大家可在公众号页面发送相关暗号关键词获取抽奖,每一篇文章会给到一个不同的暗号,对应的抽奖都是独立的,此篇暗号为【开水团】,在后台回复【开水团】,即可点击进去参与抽奖!抽奖内容、金额、个数等都无变化,在开奖前参与抽奖,操作均有效。
注意,后台(不是评论区,是后台)回复【开水团】即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
就像大家之前回复【八股】一样。