5724. 绝对差值和

题目大意

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路分析

思路参考

分析

题目大意就是可以更换nums1中的一个数为nums1中的另一个数,最后让绝对值之和最小,容易想到的贪心策略是找到绝对值最大的那一组,然后更换对应的数让它变小,后来发现这种贪心是不对的,比如[8,0,9] 和[6,7,7],只会越换越大,所以应该扫描一遍nums1,维护出更换nums[i]后绝对值减小的最大值;

坑点

  • 更换nums[i]时,应该贪心的更换左右两边距离nums2[i]最近的,这里采用二分,注意越界的判定;
  • 最后一定要记得(res-mx+mod)%mod,因为res是模后的结果,mx这里没有取模,所以res-mx可能会出现赋值,但是leetcode数据比较水;

AC代码

class Solution {
public:
    int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
    const int mod=1e9+7;
    set<int> st;
    for(auto x:nums1) st.insert(x);
    long long res=0;
    long long mx=0;
    for(int i=0;i<nums1.size();i++){
        int now=abs(nums1[i]-nums2[i]);
        res=(res+now)%mod;
        auto it=st.lower_bound(nums2[i]);
        int tmp=1e5+10;
        if(it!=st.end()) tmp=min(tmp,abs(*it-nums2[i]));
        if(it!=st.begin()) {
          it--;
          tmp=min(tmp,abs(*it-nums2[i]));
        }
      mx=max(mx,abs(now-tmp)*1ll);
    }
    return (int)(res-mx+mod)%mod;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值