2022.6.5今天你刷题了吗?
题目:
给定一个 无重复元素 的 有序 整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
"a->b" ,如果 a != b
"a" ,如果 a == b
分析:
这个数组是升序,且没有重复元素,我们要做的就是把那种按顺序的写为一种格式,单独的写一个格式,要求如下:
【0 1 2】:“0->2”
【0 2 3】:”0“,”2->3“
思路是利用两个变量,一个low记录小的下标,一个high记录大的小标,让low保持不动,high不断增加,增加的条件是,high没超过数组,并且数字连续
满足条件:high增加,low不变
不满足条件:把low,->,high依次插入一个字符串中,然后再把字符串插入vector中,最后把low更新为high+1,继续判断
解析:
1.暴力求解
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string>vec;
int i = 0;
int n = nums.size();
while (i < n)
{
int low = i;
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]));
}
//把temp转为右值
vec.push_back(move(temp));
}
return vec;
}
};
2.双指针
思路是:两个指针,一个记录区间第一个,另外一个记录区间最后一个,如果满足条件,j一直++,当不满足if条件时,说明不连续或者数组到达边界,此时先判断区间的两个指针下标是否一样,
一样:说明一个数,直接存入 nums【i】
不一样,说明是多个书,存入nums【i】和->和nums【j】
做完上面操作,更新 i 为 j+1,也就是进入下一个区间位置
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string> res;
// i 初始指向第 1 个区间的起始位置
int i = 0;
for (int j = 0; j < nums.size(); j++) {
// j 向后遍历,直到不满足连续递增(即 nums[j] + 1 != nums[j + 1])
// 或者 j 达到数组边界,则当前连续递增区间 [i, j] 遍历完毕,将其写入结果列表。
if (j + 1 == nums.size() || nums[j] + 1 != nums[j + 1]) {
string temp = to_string(nums[i]);
if (i != j) {
temp.append("->");
temp.append(to_string(nums[j]));
}
res.push_back(move(temp));
// 将 i 指向更新为 j + 1,作为下一个区间的起始位置
i = j + 1;
}
}
return res;
}
};