前言
本文将围绕数组【合并区间】问题展开讨论。
对于这一问题将采用多种思路方法来解决
一、如何理解数组的合并区间?
题目链接: [点击跳转] Leetcode 56. 合并区间
题目如下:

数组中的每个元素,都可以看作是一个整数范围,范围与范围之间可能存在重叠的部分,我们要做的就是把,重叠的范围变化成一个大的范围,相当于两个几个取并集。
二、方法一(比较排序)
观察题中所给的用例,我们可以分析出,需要合并的元素,存在一些特点:
某个范围的一个端值x(左或右)在另一个范围[a,b]内,也就是a<=x<=b
所以一条比较清晰的思路就出来了,遍历这个数组的所有元素,每个元素都有两个端值,逐个比较,再按照要求合并,最后将这个过程中的所有元素传入结果数组中即可。
但这个思路存在一些问题需要解决:
1.我们采用什么方式来比较不同元素的端值?
2.我们在进行过一个合并后,如果直接就传入到结果数组中,那么会不会忽略掉一些可能的情况,比如:要是连续遍历的三个范围都需要合并呢?如果合并两个就直接输出,那么就会漏掉需要合并的第三个范围。
3.怎样设计这个合并函数呢?
4.边界问题怎样处理?
解决方案:
1.正常情况下,由于数组中元素的不确定性导致我们必须得判断前一个范围的左右两端值在下一个范围元素的情况(!!!并且在这里也不可以直接就传入哟!!!因为我们不知道在后面会不会有隔了很远的范围元素还可以合并),所以我们可以先将数组中的所有范围做一个排序(范围左端值升序排序),然后在遍历时比较右端值在下一个范围的情况即可。
2.在合并后采用回溯,或者保持当前元素的位置,而不是直接做判断传入的动作。
3.合并函数是将确定需要合并的两个范围做合并动作,所有不再需要判断,直接取两范围最小值做新范围左值,取两范围最大值做新范围右值。
4.对于空数组,或空元素数组,或单一元素数组做特殊判断,同时也要注意数组末端的情况处理。
代码如下:
class Solution {
public:
//合并
vector<int> hebing(vector<int> A,vector<int> B) {
return {
min(A[0], B[0]), max(A[1], B[1])};
}
//升序

最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=143001651&d=1&t=3&u=0e2661049a904c0ba07ea5f6eb1cf1ab)
700

被折叠的 条评论
为什么被折叠?



