离离原上谱,公司裁员,员工排队抢名额

排队等裁员

别的公司裁员,大多数员工都提心吊胆,最近有家公司裁员,出现了员工排队抢名额的局面。

这家公司是「东风本田」。

近期行业内部传出消息,指出东风本田将面临战略调整,计划实施一次规模较大的裁员行动,预计受影响员工数量为 2000 人。

赔偿方案 N+2+1。

其中 N 代表员工在职年数,每一年对应一个月的工资作为补偿,且年数不设上限;"+2"部分是对每位被裁员工额外发放两个月工资的奖励,其计算基准为员工在过去一年(2023 年 8 月至 2024 年 7 月)的税前月平均工资;"+1"则是其他福利待遇。

面对裁员的消息,员工们并未表现出普遍的哀伤或抗议,相反,他们以一种颇为积极的姿态参与,甚至出现了排队"争取"裁员名额的现象,更有甚者,还举办了特别的欢送仪式 🤣🤣

离离原上谱,经过这两年发现,要知道一家公司好不好,除了每年年底在网上云分享他们的年终奖以外,还可以通过裁员赔偿来得知。

又是一起恶意赔偿事件,对此,你怎么看?

...

回归主题。

来一道和「秋招」相关的算法原题。

题目描述

平台:LeetCode

题号:153

已知一个长度为 n 的数组,预先按照升序排列,经由 1n 次 旋转 后,得到输入数组。

例如,原数组 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 原来是一个升序排序的数组,并进行了 1n 次旋转

二分查找

今天这道题和 81. 搜索旋转排序数组 II 相比,有了限制条件「所有整数互不相同」。

因此我们不需要进行「恢复二段性」的预处理,是可以做到严格 的复杂度。

我们仍然从「二分」的本质「二段性」进行出发分析:

alt

经过旋转的数组,显然前半段满足 >= 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 + 1if 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,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值