以下代码段的时间复杂度是多少?

时间:2017-07-06 21:22:33

标签: c++ time-complexity

我编写了以下代码片段来查找范围摘要,即,当给定一个没有任何重复项的排序整数数组时,它会将摘要返回为:

/* IP: [0,1,2,4,5,7]
 * OP: ["0->2","4->5","7"]
 */

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        vector<string> res;

        if(nums.empty())
            return res;

        for(int i=0; i<nums.size(); i++) {
            int lowerRange=nums[i];

            while(((i+1)<nums.size()) && (nums[i+1]-nums[i]==1))
                i++;

            int higherRange=nums[i];

            if(lowerRange!=higherRange) {
                string str=to_string(lowerRange)+"->"+to_string(higherRange);
                res.push_back(str);
            } else
                res.push_back(to_string(lowerRange));
        }

        return res;
    }
};

我想知道上面代码片段的时间复杂性。在我看来,我正在为数组中的每个元素做一些“任务”(执行内部while循环)(使用外部for循环)。因此,在最坏的情况下,我认为复杂度应为O(n ^ 2)。另一方面,我很怀疑,因为我在内部while循环中i++,因此,我不会在所有上使用外部来执行“任务”环。由于这个增量,我只在我的整个代码中访问所有元素一次。所以,这应该使复杂度为O(n)。有人可以确认复杂性是O(n ^ 2)还是O(n)?

2 个答案:

答案 0 :(得分:2)

由于内循环使外循环具有相同的迭代变量,因此内循环访问的任何元素都被外循环跳过。他们一起只访问每个元素。这样就可以O(n)

就时间复杂度而言,它就像一个带有if语句的循环:

for (i = 0; i < nums.size(); i++) {
    if ((i+1)<nums.size()) && (nums[i+1]-nums[i]==1)) {
        //
    } else {
        //
    }
}

以这种方式编写将需要不同的逻辑来确定何时更新lowerRangehigherRange

答案 1 :(得分:0)

你在内循环中前进,因此它以O(n)时间复杂度运行。