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

使数组相等的最小开销

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

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

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

复制代码
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 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
好悬给我拽开线10 小时前
ZILOT 论文解析
算法
饮水桶_T11 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘5612 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi12 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者13 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet13 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞14 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂15 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛