一、题目描述
给定一个无重复元素的有序整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
“a->b” ,如果 a != b
“a” ,如果 a == b
二、解题思路
题目分析,假设以示例一为例,nums=[0,1,2,4,5,7]
,区间包括,“0-2”,“4-5”,“7”,为什么不能“2-4”或者“5-7”呢?因为“2-4”之间有不存在的元素3,“5-7”之间有不存在的元素6,题目中说了:不存在属于某个范围但不属于nums的数字x。
对于一个数组,如何寻找它的汇总区间呢?
对于能够构成区间的两个数。它们之间的数肯定都是连续的,那么相邻的的两个数之间相差1
,起始数用low
表示,结束的数用high
表示。使用指针i
和依次遍历,每次比较当前所指元素和它的下一个元素,如果相邻为1
,说明这两个数是在一个区间里的的,依次比较就行,知道相邻两个数的差值超过1
.
三、代码演示
class Solution {
public List<String> summaryRanges(int[] nums) {
//初始化一个素组列表用于存储结果集
List<String> res = new ArrayList<>();
int i = 0;
while (i<nums.length){
int low = i;
i++;
//找到非连续的点之后,i++就是继续向后移动一位
while (i<nums.length && nums[i] - nums[i-1]==1){
i++;
}
//结束点的初始位置从i-1开始
int high = i-1;
//要做字符串拼接
StringBuilder sb = new StringBuilder(Integer.toString(nums[low]));
if (low<high){
sb.append("->");
sb.append(nums[high]);
}
res.add(sb.toString());
}
return res;
}
}