假设我们有一个排序的整数数组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, ]