含双指针的嵌套循环算法时间复杂度分析正确性确认
双指针算法的时间复杂度分析疑问
int sumClosest(std::vector<int> vec,const int& target) { std::sort(vec.begin(),vec.end()); int diff = std::numeric_limits<int>::max(); for(int i=0 ;i<vec.size();i++) { int left = i+1; int right = vec.size()-1; while(left<right) { int sum = vec[i] + vec[left] + vec[right]; //calculate difference from the target int sumdiff = std::abs(sum-target); //No need to check which is bigger. target or sum. So use std::abs //if there is no difference if(sum == target){ return sum; } //Check if the new diff is less than what we already have stored if(sumdiff < diff) { std::cout << vec[i] << vec[left] << vec[right] << std::endl; diff = sum; } if(sum > target) { right--; } else if(sum < target) { left++; } } } return diff+target; }
我的理解如下:
- 排序操作的时间复杂度为
O(nlogn) - 外层
for循环嵌套内层while循环的时间复杂度为O(n²),因此整体复杂度为O(nlogn) + O(n²)
但我得到的解释如下:
以下是时间复杂度分析:
使用std::sort对向量排序的时间复杂度为O(N * log(N)),其中N为输入向量vec的大小。
代码采用嵌套循环结构,外层循环遍历排序后的每个元素,为O(N)次迭代。内层while循环仅遍历整个向量一次,同样为O(N)次迭代。内层循环中的加法、减法和比较均为常数时间操作。
时间复杂度的主导项为排序步骤,即O(N * log(N))。
因此,该算法的整体时间复杂度为O(N * log(N)),其余寻找最接近和的部分对复杂度的贡献更低。
我认为上述解释不正确,for循环嵌套while循环的时间复杂度应为O(n²),整体复杂度应为O(nlogn) + O(n²) = O(n²)。请问我的理解是否正确?
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

