zoukankan      html  css  js  c++  java
  • b_lc_绝对差值和(贪心)

    可以选用 A 中的 任意一个 元素来替换 A 中的 至多 一个元素,以 最小化 绝对差值和(|A[i] - B[i]|)。
    在替换数组 A 中最多一个元素 之后 ,返回最小绝对差值和(n<=1e5)

    贪心:每次找到最接近 B[i] 的数 (小于B[i]以及>=B[i],结果个数可能是0或1或2个),然后取每次替换后的增量,看看谁小。

    const int mod=1e9+7;
    class Solution {
    public:
        int minAbsoluteSumDiff(vector<int>& A, vector<int>& B) {
            int d = 0, n = A.size();
            for (int i=0; i<n; i++) {
                d = (d + abs(A[i]-B[i])) % mod;
            }
            set<int> st(A.begin(), A.end());
            int ans = INT_MAX;
            for (int i=0; i<n; i++) {
                auto it = st.lower_bound(B[i]);
                if (it != st.end()) { //先找>=B[i]先判断这个可以减少一次it++运算
                    int v = *it;
                    int t = d - abs(A[i] - B[i]) + abs(v - B[i]);
                    ans = min(ans, t);
                }
                if (it != st.begin()) { //再找<B[i]的
                    it--;
                    int v = *it;
                    int t = d - abs(A[i] - B[i]) + abs(v - B[i]);
                    ans = min(ans, t);
                }
            }
            return ans;
        }
    };
    
  • 相关阅读:
    正则表达式
    vim
    linux 6 安装 zabbix.3服务
    内核链表学习记录
    rpc-protobuff-实现
    Qedis实现
    try-catch 异常捕获学习
    协程的学习和使用
    惊群的学习研究 这人的博客还有其他干货
    互斥锁与自旋锁的区别测试代码
  • 原文地址:https://www.cnblogs.com/wdt1/p/14615919.html
Copyright © 2011-2022 走看看