以下代码片段的时间复杂度是多少?
What is the time complexity of the following code snippet?
我编写了以下代码片段来查找范围摘要,即,当给定一个没有任何重复项的排序整数数组时,它将摘要返回为:
/* 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++
,因此,我不会对使用外部 for 循环的所有元素执行"任务"。 由于这种增量,我在整个代码中只访问一次所有元素。 因此,这应该使复杂性为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 {
//
}
}
以这种方式编写它需要不同的逻辑来确定何时更新lowerRange
和higherRange
。
你在内部循环中前进,因此它以 O(n( 的时间复杂度运行。
相关文章:
- while循环中while循环的时间复杂度是多少
- 函数的时间复杂度是多少?
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 给定C++代码的时间复杂度是多少?
- 将数组的元素插入映射的时间复杂度是多少?
- 以下递归代码的时间复杂度是多少?
- 在C++中修改字符串的BigO时间复杂度是多少
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 此特定代码的时间复杂度是多少?
- % 运算符的时间复杂度C++是多少?
- 三和算法的时间复杂度是多少
- 以下代码片段的时间复杂度是多少?
- 用于搜索的给定代码的时间复杂度是多少
- std::map的时间复杂度是多少
- 遍历二维数组的时间复杂度是多少
- 这个代码(来自leetcode)的时间复杂度是多少
- 以下代码的时间复杂度是多少
- 这个算法的时间复杂度是多少
- 以下循环的时间复杂度是多少
- 一个清晰的函数的时间复杂度是多少,根据大 O,是 std::map