之前在网上也经常看到某某失业之后不敢让家里人知道,白天就到公园里闲逛,假装去上班,还有的是去星巴克,一坐就是一整天。其实我觉得这个真没必要,失业又不是得了绝症,和家里人沟通一下,还是能理解的,谁还没经历过失业?除了体制内的我估计至少80%的人都会经历过失业,有的还会经历过多次。失业没什么,没必要假装去上班。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第56题:合并区间。
问题描述
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
问题分析
public int[][] merge(int[][] intervals) {
// 按照起始点对数组进行排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int start = intervals[0][0];
int end = intervals[0][1];
List<int[]> ans = new ArrayList<>();
for (int[] interval : intervals) {
if (interval[0] <= end) {// 当前区间和前面区间合并
end = Math.max(end, interval[1]);
} else {// 当前区间和前面区间不能合并,把前面的区间添加进来。
ans.add(new int[]{start, end});
start = interval[0];
end = interval[1];
}
}
ans.add(new int[]{start, end});// 最后的区间要单独添加。
// 把集合转为数组。
return ans.toArray(new int[ans.size()][]);
}
public:
vector<vector<int>> merge(vector<vector<int>> &intervals) {
// 按照起始点对数组进行排序
sort(intervals.begin(), intervals.end());
int start = intervals[0][0];
int end = intervals[0][1];
vector<vector<int>> ans;
for (vector<int> &interval: intervals) {
if (interval[0] <= end) {// 当前区间和前面区间合并
end = max(end, interval[1]);
} else {// 当前区间和前面区间不能合并,把前面的区间添加进来。
ans.push_back({start, end});
start = interval[0];
end = interval[1];
}
}
ans.push_back({start, end});// 最后的区间要单独添加。
return ans;
}
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 按照起始点对数组进行排序
intervals.sort(key=lambda x: x[0])
ans = []
start, end = intervals[0][0], intervals[0][1]
for interval in intervals:
if interval[0] <= end: # 当前区间和前面区间合并
end = max(end, interval[1])
else: # 当前区间和前面区间不能合并,把前面的区间添加进来。
ans.append([start, end])
start = interval[0]
end = interval[1]
ans.append([start, end]) # 最后的区间要单独添加。
return ans