专栏:50多种数据结构彻底征服
专栏:50多种经典图论算法全部掌握
最近一份针对字节跳动豆包大模型负责人乔木的举报文件在网上流传,内容是乔木婚内出轨同组HRBP程某,且存在经济问题(公款携程某某赴美出差、拒付女儿抚养费等)。
3月28日据多名内部人士透露,乔木和程某的飞书账号状态显示暂停使用,有内部人士表示这意味着公司内部或已启动调查。
乔木毕业于西安交大,2014年加入字节跳动,他的妻子罗某某也是西安交大的本科生,中山大学硕士,有两个女儿一个3岁,一个8岁。网上的传言比较多,下面是我用豆包的提问,已经简要概述了。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第1288题:删除被覆盖区间,难度是中等。
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例1:
输入:intervals = [[1,4],[3,6],[2,8]] 输出:2 解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
1 <= intervals.length <= 1000
0 <= intervals[i][0] < intervals[i][1] <= 10^5
对于所有的 i != j:intervals[i] != intervals[j]
问题分析
这题说的是删除重叠区间后,返回剩余区间的数量,所谓重叠区间,就是一个区间完全被另一个区间给覆盖了。
我们先对所有区间按照起始点从小到大排序,如果起始点相同,则按照区间终点从大到小排序。排序之后,下一个区间的起始点一定不下于前一个区间的起始点,我们只需要判断下一个区间的终点是否小于前一个区间的终点end即可。
如果下一个区间的终点小于等于前一个区间的终点end,说明下一个区间被前一个区间给覆盖了,要累加覆盖区间的个数。如果下一个区间的终点大于前一个区间的终点end,说明下个区间没有覆盖,要更新end的值。
最后用总的区间数量减去覆盖的区间数量,就是剩余区间的数量。
JAVA:
public int removeCoveredIntervals(int[][] intervals) { // 根据起始位置,从小到大排序,如果起始位置大小一样,就根据指针位置按照从大到小排序。 Arrays.sort(intervals, (o1, o2) -> { if (o1[0] == o2[0]) return o2[1] - o1[1]; return o1[0] - o2[0]; }); int end = intervals[0][1]; int cnt = 0;// 删除的区间数量 for (int i = 1; i < intervals.length; i++) { if (intervals[i][1] <= end) cnt++; else { end = intervals[i][1]; } } return intervals.length - cnt; }C++:
public: int removeCoveredIntervals(vector
> &intervals) { // 根据起始位置,从小到大排序,如果起始位置大小一样,就根据指针位置按照从大到小排序。 sort(intervals.begin(), intervals.end(), [](constvector
&a, constvector
&b) { return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0]; }); int end = intervals[0][1]; int cnt = 0;// 删除的区间数量 for (int i = 1; i < intervals.size(); i++) { if (intervals[i][1] <= end) cnt++; else { end = intervals[i][1]; } } return intervals.size() - cnt; }
笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。
