문제
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
제한사항`
- 0 <= nums.length <= 20
- -231 <= nums[i] <= 231 - 1
- All the values of nums are unique.
- nums is sorted in ascending order.
입출력 예
1
2
3
4
5
6
7
8
| 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"
|
1
2
3
4
5
6
7
8
9
| 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"
|
1
2
3
4
| Example 3:
Input: nums = []
Output: []
|
1
2
3
4
| Example 4:
Input: nums = [-1]
Output: ["-1"]
|
1
2
3
4
| Example 5:
Input: nums = [0]
Output: ["0"]
|
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| class Solution {
public:
std::string RangeStr(const vector<int>& nums, int start, int last) {
std::string ans;
if (start != last) {
ans = std::to_string(nums[start]) + "->" + std::to_string(nums[last]);
} else {
ans = std::to_string(nums[start]);
}
return ans;
}
vector<string> summaryRanges(vector<int>& nums) {
if (!nums.size()) {
return {};
}
std::vector<string> result;
int start_index = 0;
int last_index = 0;
for (auto i = 0 ; i < nums.size() - 1 ; ++i) {
if (nums[i] + 1 == nums[i + 1]) {
last_index = i + 1;
} else {
result.push_back(RangeStr(nums, start_index, last_index));
start_index = i + 1;
last_index = i + 1;
}
}
if (last_index != nums.size()) {
result.push_back(RangeStr(nums, start_index, last_index));
}
return result;
}
};
|