力扣链接:https://leetcode-cn.com/probl…
解题思路:
- 这道题整体上自身比较简单,然而要解决的边界条件绝对比拟多
- 数组是排序的,那么在 [lower, upper] 这个区间中,如果没有缺失数字 / 区间的话,实践上每个数字都应该是相邻的,那么就能够从 lower 做为终点,顺次进行遍历,如果数组中的数字大于 lower 开始的游标 (每次比拟完 lower 加一),那么就阐明有缺失,此时的缺失能够分为两种状况:(1)只缺失了一个数字,那么 lower 就等于 nums[i] – 1 (2) 缺失多个数字:lower 就小于 nums[i] – 1.
- 最初整个数组遍历完结之后,游标此刻指向数组最初一个数 +1,然而 upper 不肯定和最初一个数相等,也有可能大于最初一个数字,那么这个时候就须要比拟游标和 upper 的大小,如果相等则将 upper 退出,如果 upper 大于 l, 那么退出 l ->upper
class Solution {
public:
vector<string> findMissingRanges(vector<int>& nums, int lower, int upper) {
long l = lower;
vector<string> ans;
for(int i = 0; i < nums.size(); ++i)
{if(l == nums[i])
l++;// 相等,我跳过你
else if(l < nums[i])
{ // 有空缺
if(l < nums[i]-1)// 大于 1
ans.push_back(to_string(l)+"->"+to_string(nums[i]-1));
else if(l == nums[i]-1)// 等于 1
ans.push_back(to_string(l));
l = long(nums[i])+1;// 更新 l 到 nums[i]下一个数
// [2147483647]
// 0
// 2147483647
}
}
if(l < upper)
ans.push_back(to_string(l)+"->"+to_string(upper));
else if(l==upper)
ans.push_back(to_string(l));
return ans;
}
};