排队等裁员
别的公司裁员,大多数员工都提心吊胆,最近有家公司裁员,出现了员工排队抢名额的局面。
这家公司是「东风本田」。
近期行业内部传出消息,指出东风本田将面临战略调整,计划实施一次规模较大的裁员行动,预计受影响员工数量为 2000 人。
赔偿方案 N+2+1。
其中 N 代表员工在职年数,每一年对应一个月的工资作为补偿,且年数不设上限;"+2"部分是对每位被裁员工额外发放两个月工资的奖励,其计算基准为员工在过去一年(2023 年 8 月至 2024 年 7 月)的税前月平均工资;"+1"则是其他福利待遇。
面对裁员的消息,员工们并未表现出普遍的哀伤或抗议,相反,他们以一种颇为积极的姿态参与,甚至出现了排队"争取"裁员名额的现象,更有甚者,还举办了特别的欢送仪式 🤣🤣
离离原上谱,经过这两年发现,要知道一家公司好不好,除了每年年底在网上云分享他们的年终奖以外,还可以通过裁员赔偿来得知。
又是一起恶意赔偿事件,对此,你怎么看?
...
回归主题。
来一道和「秋招」相关的算法原题。
题目描述
平台:LeetCode
题号:153
已知一个长度为 n
的数组,预先按照升序排列,经由 1
到 n
次 旋转 后,得到输入数组。
例如,原数组 nums = [0,1,2,4,5,6,7]
在变化后可能得到:
-
若旋转 4
次,则可以得到[4,5,6,7,0,1,2]
-
若旋转 7
次,则可以得到[0,1,2,4,5,6,7]
注意,数组 旋转一次 的结果为数组 。
给你一个元素值 互不相同 的数组 nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。
请你找出并返回数组中的最小元素。
示例 1:
输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:
输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:
输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
提示:
-
-
-
-
nums
中的所有整数互不相同 -
nums
原来是一个升序排序的数组,并进行了1
至n
次旋转
二分查找
今天这道题和 81. 搜索旋转排序数组 II 相比,有了限制条件「所有整数互不相同」。
因此我们不需要进行「恢复二段性」的预处理,是可以做到严格 的复杂度。
我们仍然从「二分」的本质「二段性」进行出发分析:
经过旋转的数组,显然前半段满足 >= nums[0]
,而后半段不满足 >= nums[0]
。我们可以以此作为依据,通过「二分」找到旋转点。然后通过旋转点找到全局最小值即可。
Java 代码:
class Solution {
public int findMin(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
return r + 1 < n ? nums[r + 1] : nums[0];
}
}
C++ 代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
return r + 1 < n ? nums[r + 1] : nums[0];
}
};
Python 代码:
class Solution:
def findMin(self, nums: List[int]) -> int:
n = len(nums)
l, r = 0, n - 1
while l < r:
mid = l + r + 1 >> 1
if nums[mid] >= nums[0]: l = mid
else: r = mid - 1
return nums[r + 1] if r + 1 < n else nums[0]
TypeScript 代码:
function findMin(nums: number[]): number {
const n: number = nums.length;
let l: number = 0, r: number = n - 1;
while (l < r) {
const mid: number = l + r + 1 >> 1;
if (nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
return r + 1 < n ? nums[r + 1] : nums[0];
};
-
时间复杂度: -
空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉