题目: 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。
示例 1:
输入: [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]
解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。
示例 2:
输入: [0,2,3,4,6,8,9]
输出: ["0","2->4","6","8->9"]
解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。
题解: 找到不是连续区间可以想到只要两个相邻的元素相差是大于1的就不是连续的。有两个这个总体思路之后, 再在细节上进行优化,这个题目的测试用例涉及到了整型范围的问题,边界差一就溢出了,这个点要考虑一下。 然后对于最后一个数据
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> stringList = new ArrayList<>();
int startPoint = -1;
int endPoint = -1;
if (nums.length == 1) {
stringList.add(nums[0] + "");
return stringList;
}
for (int i = 1; i < nums.length; i++) {
// if ((long) nums[i] - (long) nums[i - 1] > 1) {
// 一开始是上面这么写的 因为[-2147483648->-2147483647, 2147483647]
// 计算减法会溢出 结果是错的
// 后来参考了别人的写法 发现加法是可以避免这种溢出问题的
if (1 + nums[i - 1] < nums[i]) {
startPoint = endPoint + 1;
endPoint = i - 1;
// 如果两个指针指向同一个数据 那就直接转字符串
if (startPoint == endPoint) {
stringList.add(nums[startPoint] + "");
} else {
stringList.add(nums[startPoint] + "->" + nums[endPoint]);
}
// 最后剩一个数 相差大于1 就是endPoint 是数组最大下标减1 (nums.length - 1 -1) 就单独加在后面
if (endPoint == nums.length - 2) {
stringList.add(nums[nums.length - 1] + "");
}
} else if (i == nums.length - 1) {
// 这个分支包含了
// 1.如果到最后也没有一个差距大于1的 整个就一个递增数组 直接输出 [0,1,2,3]这种情况
// 2.最后一个数字和倒数第二个数字 相差为1的情况 [0,1,2,4,5]
stringList.add(nums[endPoint + 1] + "->" + nums[nums.length - 1]);
}
}
return stringList;
}
}
将判断条件优化后:
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> ans = new ArrayList<>();
if(nums.length==0)
return ans;
for(int i=0;i<nums.length;i++)
{
//当前字符串
StringBuffer temp = new StringBuffer();
int pre=nums[i];
//子序列开头字符
temp.append(pre);
while(i+1<nums.length&&nums[i+1]==nums[i]+1)//找到子序列结尾
i++;
//若子序列不是一个数,则加上“->”和末尾数字
if(pre!=nums[i])
{
temp.append("->");
temp.append(nums[i]);
}
ans.add(temp.toString());
}
return ans;
}
}
时间复杂度:o(n)
空间复杂度:o(1)