> For the complete documentation index, see [llms.txt](https://jaywin.gitbook.io/leetcode/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jaywin.gitbook.io/leetcode/solutions/0228-summary-ranges.md).

# 0228. Summary Ranges

<https://leetcode.com/problems/summary-ranges>

## Description

You are given a **sorted unique** integer array `nums`.

Return *the **smallest sorted** list of ranges that **cover all the numbers in the array exactly***. That is, each element of `nums` is covered by exactly one of the ranges, and there is no integer `x` such that `x` is in one of the ranges but not in `nums`.

Each range `[a,b]` in the list should be output as:

* `"a->b"` if `a != b`
* `"a"` if `a == b`

**Example 1:**

```
**Input:** nums = [0,1,2,4,5,7]
**Output:** ["0->2","4->5","7"]
**Explanation:** The ranges are:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"
```

**Example 2:**

```
**Input:** nums = [0,2,3,4,6,8,9]
**Output:** ["0","2->4","6","8->9"]
**Explanation:** The ranges are:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"
```

**Example 3:**

```
**Input:** nums = []
**Output:** []
```

**Example 4:**

```
**Input:** nums = [-1]
**Output:** ["-1"]
```

**Example 5:**

```
**Input:** nums = [0]
**Output:** ["0"]
```

**Constraints:**

* `0 <= nums.length <= 20`
* `-231 <= nums[i] <= 231 - 1`
* All the values of `nums` are **unique**.
* `nums` is sorted in ascending order.

## ac

```java
// in a loop, be careful about the boundary
class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> res = new ArrayList<String>();
        //  corner cases
        if (nums.length == 0) return res;

        // two pointers, walk, +1 continue
        int i1 = 1, i2 = 0;
        while (i1 < nums.length) {
            if (nums[i1] == nums[i1-1]+1) {
                i1++;
                continue;
            } else {
                if (i1-i2 > 1) res.add(nums[i2]+"->"+nums[i1-1]);
                else res.add(nums[i2]+"");
                i2 = i1;
                i1++;
            }
        }
        if (i1-i2 > 1) res.add(nums[i2]+"->"+nums[i1-1]);
        else res.add(nums[i2]+"");

        return res;
    }
}
```

## ac2: cleaner for loop

```java
class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> res = new ArrayList<String>();
        //  corner cases
        if (nums.length == 0) return res;

        for (int i1 = 0, i2 = 0; i1 < nums.length; i1++) {
            if (i1+1 < nums.length && nums[i1] == nums[i1+1] - 1) continue;
            if (i1 == i2) res.add(nums[i2]+"");
            else res.add(nums[i2]+"->"+nums[i1]);
            i2 = i1+1;
        }

        return res;
    }
}
```
