163. Missing Ranges
问题描述:
Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, upper], return its missing ranges.
Example:
Input: nums =[0, 1, 3, 50, 75]
, lower = 0 and upper = 99, Output:["2", "4->49", "51->74", "76->99"]
解题思路:
这道题首先我发现要我们返回string的字符串,所以对于每一个范围,我想写一个单独的方法来生成一个字符串,并将其加入到返回数组中,即toString。
这个范围跟数组的关系并没有明确指出:
可是数组中的数字都在范围中,也可能都不在范围中,也可能有部分在范围中。
我们可以逐渐改变lower的值,来寻找缺失范围。
从i=0开始遍历,当前值nums[i]与lower的关系有以下几种:
1. num[i] == lower : 这时候lower++,检查范围中下一个数字。
2. nums[i] > lower:代表缺失lower到nums[i]-1这个范围,但是nums[i]-1可能比upper要大,所以我们要取最小值。
一定要记得!更新lower为nums[i]+1!!!!
3. nums[i] < lower :还没到指定范围内,寻找下一个。
因为有可能给定数组的都在给定范围的左边,所以我们要判断lower > upper: true则要退出数组
代码:
class Solution { public: vector<string> findMissingRanges(vector<int>& nums, int lower, int upper) { vector<string> ret; if(nums.size() == 0){ toString(ret, lower, upper); return ret; } int start = -1, end = -1; for(int i = 0; i < nums.size(); i++){ if(i > 0 && nums[i] == nums[i-1]) continue; if(nums[i] > lower){ start = lower; end = min(nums[i]-1, upper); toString(ret, start,end); lower = nums[i]+1; }else if(nums[i] == lower){ lower++; } if(lower > upper) break; } int last = nums[nums.size()-1]; if(last < upper){ toString(ret, last+1, upper); } return ret; } void toString(vector<string> &ret, int start, int end){ if(start == end){ ret.push_back(to_string(start)); return; } string str = to_string(start) + "->" + to_string(end); ret.push_back(str); } };