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

C++实现四数之和(FourSum)性能优化咨询

优化四数之和(FourSum)C++程序的性能问题

我完全理解你的困惑——毕竟C以接近底层的性能著称,四层循环的朴素解法居然比Java慢10-15倍确实有点反直觉。咱们一步步拆解问题,看看问题出在哪,以及怎么把C的性能优势找回来。

为什么四层循环的C++会慢?

这种反直觉的表现主要来自两个核心原因:

  • 缓存命中率拉胯:四层嵌套循环会疯狂地随机访问数组元素,当数组规模较大时,CPU缓存很容易被打穿,导致大量的内存访问等待。而Java的JVM在缓存优化上藏了不少黑科技(比如逃逸分析、对象内存对齐),反而在这种密集循环场景下能意外地利用缓存特性。
  • 编译器优化的局限性:虽然C++编译器的优化能力很强,但四层嵌套循环如果没被充分展开或优化,会残留不少循环边界检查、寄存器溢出的开销。而Java的即时编译器(JIT)在运行时能根据实际数据模式做更激进的优化,比如针对热点代码的循环展开、分支预测优化。

用更高效的算法把C++的性能优势找回来

你提到的排序+二分查找已经能大幅提升性能,但还有更优的双指针方案,直接把时间复杂度从O(n⁴)压到O(n²),同时能彻底发挥C++的底层优势:

优化思路:排序+双指针法

  1. 先排序数组:花O(n log n)的时间排序,不仅能让我们利用有序数组的特性减少重复计算,还能为双指针的移动提供依据。
  2. 固定前两个数,双指针遍历后两个数:固定i和j两个下标,然后用左指针从j+1、右指针从数组末尾开始向中间移动,根据四数之和与0的大小关系调整指针位置,同时跳过重复元素避免生成重复解。

示例C++代码

#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    vector<vector<int>> result;
    int n = nums.size();
    if (n < 4) return result;
    
    // 先排序数组
    sort(nums.begin(), nums.end());
    
    for (int i = 0; i < n - 3; ++i) {
        // 跳过重复的i,避免重复解
        if (i > 0 && nums[i] == nums[i-1]) continue;
        for (int j = i + 1; j < n - 2; ++j) {
            // 跳过重复的j
            if (j > i + 1 && nums[j] == nums[j-1]) continue;
            
            int left = j + 1;
            int right = n - 1;
            while (left < right) {
                // 用long long避免整数溢出
                long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
                if (sum == target) {
                    result.push_back({nums[i], nums[j], nums[left], nums[right]});
                    // 跳过重复的left和right
                    while (left < right && nums[left] == nums[left+1]) left++;
                    while (left < right && nums[right] == nums[right-1]) right--;
                    left++;
                    right--;
                } else if (sum < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
    }
    return result;
}

额外提升:开启编译器优化

别忘了编译时开启O2或O3优化选项(比如g++ -O3 your_code.cpp),C++编译器在高优化级别下会做循环展开、寄存器分配优化、死代码消除等操作,能让程序的运行速度再上一个台阶。

当你切换到这种高效算法后,C++的底层优势(更低的内存开销、直接的寄存器操作、无JVM运行时开销)就会完全显现出来,性能肯定能超过Java版本。

内容的提问来源于stack exchange,提问作者JiveTurkey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:13:34