---
# System prepended metadata

title: 228. Summary Ranges
tags: [Leetcode, python, array, c++, easy]

---

###### tags: `Leetcode` `easy` `array` `python` `c++`

# 228. Summary Ranges

## [題目連結:] https://leetcode.com/problems/summary-ranges/description/

## 題目:
You are given a **sorted unique** integer array ```nums```.

A **range** ```[a,b]``` is the set of all integers from ```a``` to ```b``` (inclusive).

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"
```

## 解題想法:
* 此題為給一已排序好的數列，求出連續的序列，並將其首尾兩數字之間用"->"連接
* Linear遍歷數組即可:
    * 需額外加入個正無窮於數組尾，避免原數組最後一個數字沒判斷到
    * startPos=0: 用以記錄連續區間的起始位置


## Python:
``` python=
class Solution(object):
    def summaryRanges(self, nums):
        """
        :type nums: List[int]
        :rtype: List[str]
        """
        n=len(nums)
        if n==0:
            return []
        #額外加入個正無窮
        nums.append(float("inf"))
        res=[]
        startPos=0 #連續區間的起始位置
        for i in range(n): #此i跑loop是不包含無限大的length 確保不會超出array
            #不連續才要進行裁斷
            if (nums[i+1]-nums[i])!=1:
                res.append(str(nums[i]) if i==startPos else "%d->%d" %(nums[startPos], nums[i]))
                startPos=i+1 #將區間往後紀錄
        return res

if __name__ == '__main__':
    result = Solution()
    nums = [0,1,2,4,5,7]
    ans = result.summaryRanges(nums)
    print(ans)
#Input: nums = [0,1,2,4,5,7]
#Output: ["0->2","4->5","7"]
```

## C++:
* The **to_string()** method accepts a value of any basic data type and converts it into a string
* 添加**INT_MIN**整數最**小**，
    * 因為若使用INT_MAX: 其值為2147483647
    * 則若nums=[2147483645,2147483646]此極端case，會無法正確輸出
``` cpp=
class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int n=nums.size();
        if (n==0)
            return {};
        vector<string> res;
        nums.push_back(INT_MIN);
        int startPos=0;
        for (int i=0; i<n; i++){
            if ((long(nums[i+1])-nums[i]) != 1){
                res.push_back( (i==startPos? to_string(nums[i]): to_string(nums[startPos])+"->"+to_string(nums[i])));
                startPos=i+1;
            }
        }
        return res;
    }
};
```