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

数组归并为单个元素的最小成本自研算法正确性验证

合并数组最小总成本自研算法正确性询问

问题背景

给定包含N个元素的无序数组,每次可合并任意两个元素为一个,合并成本等于两个元素的取值之和,要求计算将所有元素合并为单个时的最小总成本。

示例:
给定数组 A = [1,2,3,4]
第一步选择1和2合并,成本为1+2=3,此时数组变为[3,3,4],累计成本为3。
第二步选择两个3合并,成本为3+3=6,此时数组变为[4,6],累计成本为9。
第三步选择4和6合并,成本为4+6=10,此时数组仅剩[10],累计总成本为19。

该问题的经典解法核心是每次选取当前最小的两个元素合并,通常用最小堆实现,取最小元素时间复杂度O(1),插入新元素复杂度O(log n),整体时间复杂度O(n log n)。

自研方案说明

我设计了另一种思路,暂未找到反例:我认为每次选取的两个最小元素的和,一定大于此前所有合并得到的和,因此存储合并和的temp数组天然有序,可以通过双指针O(1)获取当前最小元素。
该算法先对输入数组排序,再通过双指针分别遍历原有序数组和有序temp数组选取最小两个元素合并,时间复杂度同样为O(n log n),实现代码如下:

int minCost(vector<int>& arr) {
    sort(arr.begin(), arr.end());
    // temp数组存储每次合并得到的元素和
    vector<int> temp;
    // 原有序数组的遍历指针
    int i = 0;
    // temp数组的遍历指针
    int j = 0;
    int cost = 0;

    // 只要两个数组剩余元素总数大于1就继续合并
    while(arr.size() - i + temp.size() - j > 1) {
        int num1, num2;
        // 选取第一个最小元素
        if(i < arr.size() && j < temp.size()) {
            if(arr[i] <= temp[j])
                num1 = arr[i++];
            else
                num1 = temp[j++];
        }
        else if(i < arr.size())
            num1 = arr[i++];
        else if(j < temp.size())
            num1 = temp[j++];

        // 选取第二个最小元素
        if(i < arr.size() && j < temp.size()) {
            if(arr[i] <= temp[j])
                num2 = arr[i++];
            else
                num2 = temp[j++];
        }
        else if(i < arr.size())
            num2 = arr[i++];
        else if(j < temp.size())
            num2 = temp[j++];

        int sum = num1 + num2;
        temp.push_back(sum);
        cost += sum;
    }
    return cost;
}

疑问

请问这个自研算法是否正确?若不正确,我忽略了什么逻辑缺陷,以及存在哪些可以让算法失败的测试用例?该问题对应SPOJ平台REDARR2题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:30:03