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

使数组相等的最小开销

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

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

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

复制代码
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));
    }
};

总结

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

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

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

相关推荐
待磨的钝刨17 分钟前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习
geovindu1 小时前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法
晚风叙码2 小时前
C++ vector底层模拟实现与迭代器失效深度剖析
c++·算法
To_OC10 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_8414956410 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒15 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽17 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米17 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠18 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua