163. Missing Ranges

问题描述:

Given a sorted integer array nums, where the range of elements are in the inclusive range [lowerupper], 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);
    }
};

猜你喜欢

转载自www.cnblogs.com/yaoyudadudu/p/9348926.html