1 题目

Given a sorted integer array without duplicates, return the summary of its ranges.

For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"].

接口:public List<String> summaryRanges(int[] nums);

2 思路

给定一个排序好的数组,无重复的元素,返回这个数组的范围。看示例容易理解。
顺序扫描一遍数组,用2个指针 start 和 end来记录每一小段的范围,分割点是nums[end + 1] == nums[end] + 1),满足此条件,end指针往后移动。
细节:处理好数组的最后一个元素:若到了最后一个元素,不进行判断nums[end + 1] == nums[end] + 1),直接进入范围的统计处理。新航道雅思

复杂度: Time O(N); Space: O(1)

3 代码
       public List<String> summaryRanges(int[] nums) {        final int len = nums.length;
        List<String> result = new LinkedList<String>();
        for (int start = 0, end = 0; end < len;) {            if ((end + 1 < len) && (nums[end + 1] == nums[end] + 1)) {                end++;
            } else {                if (start == end) {
                    result.add(Integer.toString(nums[start]));
                } else {
                    result.add(nums[start] + "->" + nums[end]);
                }                end++;
                start = end;
            }
        }        return result;
    }
4 总结

题目简单,思路清晰,注意代码的细节。

5 扩展

如果数组中有重复的元素,又该如何做?

  • 多添加一个判断:nums[end + 1] == nums[end] + 1 或者 nums[end + 1] == nums[end],满足条件,end指针往后移动一位。