leetcode228-汇总区间

169 阅读2分钟

题目: 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

示例 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)