2","4->5","7"] *-6ren">
gpt4 book ai didi

c++ - 以下代码片段的时间复杂度是多少?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:31 24 4
gpt4 key购买 nike

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

/* 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;
}
};

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

最佳答案

由于内循环推进与外循环相同的迭代变量,内循环访问的任何元素都被外循环跳过。他们一起只访问每个元素一次。所以这使得它成为 O(n)

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

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

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

关于c++ - 以下代码片段的时间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com