假设我们有一个排序的整数数组nums,元素的范围在包含范围[lower,upper],我们必须找到缺失的范围。
因此,如果输入类似于nums = [0,1,3,50,75],下限值是0,上限值是99,那么输出将是[“ 2”,“ 4-> 49”,“ 51-> 74“,” 76-> 99“]
为了解决这个问题,我们将遵循以下步骤-
定义一个数组
定义一组v
对于初始化i:= 0,当i <t的大小时,更新(将i增加1),执行-
将t [i]插入v
在数字末尾插入t [i]
如果t [i]不在v中,则-
定义一个称为ret的数组
curr:=降低
i:= 0,n:= nums的大小
而curr <= upper时,执行-
temp:=将curr转换为字符串
(增加curr 1)
如果i <n并且nums [i]与curr相同,则-
除此以外
在ret的末尾插入temp
忽略以下部分,跳至下一个迭代
temp:=“->”
curr:= nums [i]
temp:= temp连接为字符串(curr-1)
curr:= nums [i]
在ret的末尾插入temp
如果curr <= upper,则-
在ret的末尾插入temp
temp:=“->”
temp:= temp将大写形式连接为字符串
curr:=上限+ 1
如果i与n相同,则-
除此以外
(将i增加1)
(增加curr 1)
如果i <n并且nums [i]与curr相同,则-
除此以外
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto< v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<string< findMissingRanges(vector<int<& t, int lower, int upper) {
vector <int< nums;
set <long long int> v;
for(int i = 0; i < t.size(); i++){
if(!v.count(t[i])){
v.insert(t[i]);
nums.push_back(t[i]);
}
}
vector < string > ret;
long long int curr = lower;
int i = 0;
int n = nums.size();
while(curr <= upper){
if(i < n && nums[i] == curr){
i++;
curr++;
}
else{
string temp = to_string(curr);
curr++;
if(i < n && nums[i] == curr){
ret.push_back(temp);
continue;
}
else{
if(i == n){
if(curr <= upper){
temp += "->";
temp += to_string(upper);
curr = (long long int )upper + 1;
}
ret.push_back(temp);
}
else{
temp += "->";
curr = nums[i];
temp += to_string(curr - 1);
curr = nums[i];
ret.push_back(temp);
}
}
}
}
return ret;
}
};
main(){
Solution ob;
vector<int< v = {0,1,3,50,75};
print_vector(ob.findMissingRanges(v, 0, 99));
}{0,1,3,50,75}, 0, 99输出结果
[2, 4->49, 51->74, 76->99, ]