中金员工人均月薪降至3.5万元,四年时间累计下滑65%。。

c8003246734b7719a7fc1eb8c8cfcded.gif

精品推荐:

《征服数据结构》《经典图论算法》

最近中金一名员工的离世引起网络的极大关注,除此之外大家最关注的就是中金员工的收入,据“每日经济新闻”中金员工的收入从4年前的月薪10万降到现在的月薪3.5万,降幅达到65%。

aa327db76b5e7fedb83ac2245f1986e2.png

我们在网上经常看到程序员晒收入,晒offer,晒工牌,但很少看到搞金融的晒这晒那,果然最富的是他们,最低调的还是他们。

从月薪10万降到月薪3.5万,这种降薪幅度确实有点大,不过我觉得就算月薪3.5万也算是高薪了,可能我没有拿过月薪10万的收入,对他这种情况也理解不了。

963ff6ab72d77694bf85b10554e8adb1.png

a6ea47552b2e12b4190fba05aafa9ac1.png

47ff94b61dd9c07f84a57ec5fc7fc576.png

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第57题:插入区间。

问题描述

来源:LeetCode第57题

难度:中等

给你一个无重叠的,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。返回插入之后的 intervals。

示例1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]

输出:[[1,5],[6,9]]

示例2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

  • 0 <= intervals.length <= 10^4

  • intervals[i].length == 2

  • 0 <= starti <= endi <= 10^5

  • intervals 根据 starti 按 升序 排列

  • newInterval.length == 2

  • 0 <= start <= end <= 10^5

问题分析

这题说的是原来的区间是按照起始点排序的,且区间没有重叠。让我们在原来的区间插入一个新的区间,如果有重叠就把他们合并,如下图所示,因为区间[1,3]和区间[2,5]有重叠,

423add1186792535ef8701ed6d456220.png

这里要判断要合并的区间和上面的哪些区间有重叠,因为上面的区间都已经按照起始点排序了,如果当前区间的终点小于合并区间的起始点,他们是没有重叠的,或者当前区间的起始点大于合并区间的终点,他们也是没有重叠的。

41fd607062fe4e83c01f4c724831c300.png

没有重叠的区间只需要单独保存下来,有重叠的区间需要合并。

JAVA:

public int[][] insert(int[][] intervals, int[] newInterval) {
    List<int[]> ans = new ArrayList<>();
    for (int[] interval : intervals) {
        if (newInterval == null || interval[1] < newInterval[0]) {
            // 前面单独的添加进来,或者已经合并完了,把后面的添加进来
            ans.add(interval);
        } else if (interval[0] > newInterval[1]) {
            ans.add(newInterval);// 后面单独的区间。
            ans.add(interval);
            newInterval = null;
        } else {// 合并区间
            newInterval[0] = Math.min(newInterval[0], interval[0]);
            newInterval[1] = Math.max(newInterval[1], interval[1]);
        }
    }
    // 如果合并之后的区间没有保存下来,要保存下来
    if (newInterval != null)
        ans.add(newInterval);
    return ans.toArray(new int[ans.size()][]);
}

C++:

public:
    vector<vector<int>> insert(vector<vector<int>> &intervals, vector<int> &newInterval) {
        vector<vector<int>> res;
        bool finish = false;// 合并完了,后面的不需要再合并了,直接添加
        for (auto const &interval: intervals) {
            if (finish || interval[1] < newInterval[0]) {
                res.emplace_back(interval);// 前面单独
            } else if (interval[0] > newInterval[1]) {// 后面单独
                res.emplace_back(newInterval);
                res.emplace_back(interval);
                finish = true;
            } else {// 有交叉,合并
                newInterval[0] = min(newInterval[0], interval[0]);//get min
                newInterval[1] = max(newInterval[1], interval[1]);//get max
            }
        }
        if (!finish)
            res.emplace_back(newInterval);
        return res;
    }

Python:

def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
    ans = []
    for interval in intervals:
        if not newInterval or interval[1] < newInterval[0]:
            # 前面单独的添加进来,或者已经合并完了,把后面的添加进来
            ans.append(interval)
        elif interval[0] > newInterval[1]:
            ans.append(newInterval[:])  # 后面单独的区间。
            ans.append(interval)
            newInterval.clear()
        else:  # 合并区间
            newInterval[0] = min(newInterval[0], interval[0])
            newInterval[1] = max(newInterval[1], interval[1])
    # 如果合并之后的区间没有保存下来,要保存下来
    if newInterval:
        ans.append(newInterval)
    return ans

5d5888e0c22b2571c1a2eb549e4eb299.gif

笔者简介

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

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值