1. 程式人生 > >LeetCode228:Summary Ranges

LeetCode228:Summary Ranges

元素 with pty containe without i++ lee ++ back

Given a sorted integer array without duplicates, return the summary of its ranges.

For example, given [0,1,2,4,5,7], return [“0->2”,”4->5”,”7”].

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.


最開始是這麽想的,能夠用一個隊列來存放連續的數字。這樣在遍歷數組的過程中將數依次放入隊列中。當某一個數和前一個數不同一時候將隊列中的數打印輸出(假設隊列中僅僅有1個元素。將這個元素打印輸出,假設隊列中有多個元素。那麽將隊列的頭和尾打印出來),然後將隊列清空。並將這個和前面元素不同的數放入隊列中。這樣遍歷到數組尾端時隊列中一定還會有元素,再將元素打印出來就能夠了。


runtime:0ms

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int length=nums.size();
        vector<string> result;
        if(length<=0)
            return result;
        vector<int> bucket;
        bucket.push_back(nums[0]);
        for
(int i=1;i<length;i++) { if(nums[i-1]==nums[i]-1) { bucket.push_back(nums[i]); } else { if(bucket.size()==1) result.push_back(to_string(bucket[0])); else { string
str=to_string(bucket.front())+"->"+to_string(bucket.back()); result.push_back(str); } bucket.clear(); bucket.push_back(nums[i]); } } if(!bucket.empty()) { if(bucket.size()==1) result.push_back(to_string(bucket[0])); else { string str=to_string(bucket.front())+"->"+to_string(bucket.back()); result.push_back(str); } } return result; } };

然後看了下Discuss,發現了一種更加優化的一種解法。沒有上面太多的分支推斷。就是從頭開始遍歷數組。一直找到第一個不連續的數。然後打印。接著再開始遍歷。這樣能夠避免上面邊界條件的處理。

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
       int length=nums.size();
       vector<string> result;
       if(length==0)
            return result;
        if(length==1)
        {
            result.push_back(to_string(nums[0]));
            return result;
        }
        for(int i=0;i<length;)
        {
            int start=i;
            int end=i;
            while(end+1<length&&nums[end]==nums[end+1]-1)
                end++;

            if(start<end)
            {
                string str=to_string(nums[start])+"->"+to_string(nums[end]);
                result.push_back(str);
            }
            else
                result.push_back(to_string(nums[start]));

            i=end+1;
        }
        return result;

    }
};

LeetCode228:Summary Ranges