给定一个 无重复元素 的 有序 整数数组 nums
。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums
的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums
的数字 x
。
列表中的每个区间范围 [a,b]
应该按如下格式输出:
"a->b"
,如果a != b
"a"
,如果a == b
示例 1:
输入:nums = [0,1,2,4,5,7] 输出:["0->2","4->5","7"] 解释:区间范围是: [0,2] --> "0->2" [4,5] --> "4->5" [7,7] --> "7"
示例 2:
输入:nums = [0,2,3,4,6,8,9] 输出:["0","2->4","6","8->9"] 解释:区间范围是: [0,0] --> "0" [2,4] --> "2->4" [6,6] --> "6" [8,9] --> "8->9"
提示:
0 <= nums.length <= 20
-2^31 <= nums[i] <= 2^31 - 1
nums
中的所有值都 互不相同nums
按升序排列
vector<string> summaryRanges(vector<int>& nums) {
vector<string> result;
if (nums.empty()) return result; // 如果数组为空,直接返回
int start = nums; // 初始化区间的起始值,应该是 nums 的第一个元素
for (int i = 1; i <= nums.size(); i++) {
// 如果当前值与前一个值不连续,或者已经是数组的最后一个元素
if (i == nums.size() || nums[i] != nums[i - 1] + 1) {
// 添加当前区间到结果集
if (start == nums[i - 1]) {
result.push_back(to_string(start)); // 单个数字的区间
} else {
result.push_back(to_string(start) + "->" + to_string(nums[i - 1])); // 范围区间
}
// 如果数组还没有遍历完,更新起始值为下一个区间的起始点
if (i < nums.size()) {
start = nums[i];
}
}
}
return result;
}
-
首先判断数组是否为空,若为空则直接返回空结果集result。
-
初始化变量start为数组的第一个元素,作为当前区间的起始值。
-
使用一个循环遍历数组,从第二个元素开始。
-
在循环中,检查当前值与前一个值是否连续。如果不连续或已经是数组的最后一个元素,说明当前区间结束。
-
在区间结束时,根据start和当前区间的结束值(即nums[i-1])构建区间字符串,并将其添加到结果集result中:
-
如果start和结束值相等,说明当前区间只有一个数字,只需添加该数字到结果集。
-
如果start和结束值不相等,说明当前区间是一个范围区间,需要添加区间起始值和结束值之间的箭头"->"。
-
如果数组还没有遍历完,将start更新为下一个区间的起始点。
-
循环结束后,返回结果集result。
解法二:
class Solution {
public:
// 主要的函数,用于找出连续区间
vector<string> summaryRanges(vector<int>& nums) {
// 存储结果的字符串数组
vector<string> ret;
// 数组的当前索引
int i = 0;
// 数组的长度
int n = nums.size();
// 循环遍历整个数组
while (i < n) {
// 记录区间的起始位置
int low = i;
// 移动到下一个数字
i++;
// 当当前数字与前一个数字连续时,继续移动
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
// 记录区间的结束位置
int high = i - 1;
// 将起始数字转换为字符串
string temp = to_string(nums[low]);
// 如果区间不只包含一个数字,添加"->"和结束数字
if (low < high) {
temp.append("->");
temp.append(to_string(nums[high]));
}
// 将生成的字符串添加到结果数组中
ret.push_back(move(temp));
}
// 返回结果数组
return ret;
}
};
具体思路如下:
-
创建一个字符串数组ret,用于存储结果。
-
初始化变量i为0,表示数组的当前索引。
-
初始化变量n为数组的长度。
-
进入一个循环,遍历整个数组。
-
在循环中,先记录当前区间的起始位置,即变量low赋值为i。
-
然后,将i递增,移动到下一个数字。
-
接着,while循环判断当前数字与前一个数字是否连续,即nums[i]是否等于nums[i-1]+1。
-
如果连续,继续移动i。
-
当不连续时,说明当前区间结束,记录区间的结束位置,即变量high赋值为i-1。
-
将起始数字转换为字符串,使用to_string(nums[low])。
-
如果区间不仅包含一个数字,需要添加"->"和结束数字。
-
将结束数字转换为字符串,使用to_string(nums[high])。
-
使用append方法将"->"和结束数字添加到起始数字字符串temp中。
-
将生成的字符串temp添加到结果数组ret中。
-
循环结束后,返回结果数组ret。