You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含双指针的嵌套循环算法时间复杂度分析正确性确认

双指针算法的时间复杂度分析疑问
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:32:53