一、汇总区间
题目描述: 给定一个 无重复 元素的 有序 整数数组 nums 。
返回恰好覆盖数组中所有数字的最小有序区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [ a , b ] 应该按如下格式输出:(1)、“a->b” ,如果 a != b (2)、 “a” ,如果 a == b
力扣:228. 汇总区间
输入:nums = [ 0 , 1 , 2 , 4 , 5 , 7 ]
输出:[“0->2”,“4->5”,“7”]
解释:区间范围是:
[0,2] --> “0->2”
[4,5] --> “4->5”
[7,7] --> “7”
题目分析: 通过示例,可以看出,区间是连续的,或者只有一个数两种情况,因为是有序的,在遍历的时候,如果 nums[i + 1] = nums[i] + 1 即可进行合并。
AC代码:
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> summary = new ArrayList<>();
for (int i, j = 0; j < nums.length; ++j){
i = j;
while (j + 1 < nums.length && nums[j + 1] == nums[j] + 1)
++j;
if (i == j)
summary.add(nums[i] + "");
else
summary.add(nums[i] + "->" + nums[j]);
}
return summary;
}
}
二、合并区间
题目描述: 给出一个区间的集合,请合并所有重叠的区间。
力扣:56.合并区间
示例 1:
输入: intervals = [ [ 1 , 3 ] , [ 2 , 6 ] , [ 8 , 10] , [ 15 , 18] ]
输出: [ [ 1 , 6 ] , [ 8 , 10] , [ 15 , 18] ]
解释: 区间 [ 1 , 3 ] 和 [ 2 , 6 ] 重叠, 将它们合并为 [ 1 , 6 ] 。
题目分析: 首先对区间按照起始端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话将区间直接加入结果集,反之如果重叠,就将当前区间与前一个区间进行合并。因为已经是按照起始点进行升序排序,合并时只需比较两个区间的尾端点,保留最大值,获得新区间。
排完序后主要分两种情况,相互分离,包含重叠部分。