算法实例分析:使数组相等的最小开销

使数组相等的最小开销

通过题意分析可知要让所有值相等,必然不需要超出数据的最大最小值,因此左右边界可以预先缩小范围。然后根据我们上面的分析不断缩小搜索边界范围。

关于函数的计算,只要统计所有数据与的差值再乘上权重即可。

最后注意,为了保证答案的正确性需要再在两端取一次最值

复制代码
class Solution {
public:
    long long minCost(vector<int>& nums, vector<int>& cost) {
        auto sum = [&](int k) -> long long {
            long long ans = 0;
            for (int i = 0; i < nums.size(); i += 1) {
                ans += 1LL * cost[i] * abs(nums[i] - k);
            }
            return ans;
        };

        int left  = *min_element(nums.begin(), nums.end());
        int right = *max_element(nums.begin(), nums.end());
        while (left <= right) {
            int lmid = left + (right - left) / 3;
            int rmid = right - (right - left) / 3;
            /// 凹区间
            if (sum(lmid) <= sum(rmid)) {
                right = rmid - 1;
            } else {
                left = lmid + 1;
            }
        }

        // 最终取两点间的最值
        return min(sum(left), sum(right));
    }
};

总结

再回头看一下二分与三分的书写形式会发现两者是如此的相像。因此我们要着重注意两者的区别:

本文只是列举了两个典型的简单例子,各种应用场景对算法的具体细节有所差异。

但是万变不离其宗,只要理清搜索的实际的搜索流程就不需要僵硬地套用所谓的模板。

相关推荐
吃好睡好便好5 小时前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
爱炼丹的James5 小时前
第三章 搜索和图论
数据结构·算法·图论
菜菜笔记5 小时前
【无标题】
算法
努力努力再努力wz5 小时前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
Gauss松鼠会5 小时前
GaussDB(DWS) 资源监控Topsql
java·网络·数据库·算法·oracle·性能优化·gaussdb
夏日听雨眠5 小时前
数据结构(快速排序)
java·数据结构·算法
薇茗5 小时前
【初阶数据结构】 升沉有序的平仄 排序 3
c语言·开发语言·数据结构·算法·排序算法·文件归并排序
薇茗5 小时前
【初阶数据结构】 升沉有序的平仄 排序 2
c语言·数据结构·算法·排序算法·快排精讲
AI科技星5 小时前
强哥德巴赫猜想(1+1)终极证明(2026 年5月 21 日)
开发语言·人工智能·算法·计算机视觉·量子计算