1818. 绝对差值和

该博客介绍了如何解决LeetCode上的1818题,即找到数组nums1中可以替换的一个元素,以最小化与nums2数组的差值绝对和。博主首先对nums1进行排序,然后使用二分查找法寻找可以减小差值的元素,并通过计算与nums2[i]的差值来更新最小绝对差值和。最后返回对10^9 + 7取余后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目描述


数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。

你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。

在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。

|x| 定义为:

如果 x >= 0 ,值为 x ,或者
如果 x <= 0 ,值为 -x

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-absolute-sum-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例

2. 代码描述

2.1 题目内容

修改nums1[]数组内某一个数值,修改方法为以nums1[]数组内某一值复制修改,能被修改的位置只有一处。求经此修改后,两个数组的差值绝对值之和最小的答案。

2.2 代码思路

a.对于nums1[]进行排序

b.利用二分法查找

c.maxn相对于初始时差值减少量

2.3 代码细节

2.3.1 vector<int> rec(nums1)

此处使用vector的复制,将nums1赋值于rec

2.3.2 lower_bound()

二分查找

3. 代码

3.1代码内容

class Solution {
public:
    const int mod = 1e9+7;
    int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
        vector<int> rec(nums1);
        sort(rec.begin(),rec.end());
        long long maxn = 0,diff = 0,sum = 0;
        int n = nums1.size();
        for(int i=0;i<n;i++){
            diff = abs(nums1[i]-nums2[i]);
            sum += diff;
            int j = lower_bound(rec.begin(),rec.end(),nums2[i])-rec.begin();
            if(j<n)
                maxn = max(maxn, diff - (rec[j]-nums2[i]));
            if(j>0)
                maxn = max(maxn, diff - (nums2[i]-rec[j-1]));
        }
        return (sum + mod - maxn)%mod;
    }
};

3.2 提交结果在这里插入图片描述

### 基于绝对差值排序与滤波的算法实现 基于绝对差值进行排序滤波是一种有效的信号处理技术,尤其适合用于去除异常值并平滑数据序列。以下是该方法的核心思路及其具体实现。 #### 方法概述 假设有一组原始数据 \( \{x_1, x_2, ..., x_n\} \),可以通过计算相邻样本之间的绝对差值来评估其稳定性。对于每一个数据点 \( x_i \),可以定义它的绝对差值为: \[ d_i = |x_{i+1} - x_i| \] 随后可以根据这些差值对数据进行排序或筛选,从而剔除那些具有较大波动的数据点。这种方法特别适用于检测快速变化或突变的情况,并能有效保留较为平稳的部分。 --- #### 排序与滤波的具体步骤 以下是一个完整的 Python 实现示例,展示如何利用绝对差值对数据进行排序与滤波: ```python def abs_diff_filter(data, threshold): """ 使用绝对差值进行排序与滤波 参数: data (list): 输入的一维数据列表 threshold (float): 差值阈值,超过此值的数据会被过滤掉 返回: list: 过滤后的数据列表 """ filtered_data = [] # 计算每一对连续数据点的绝对差值 diffs = [abs(data[i+1] - data[i]) for i in range(len(data)-1)] # 添加第一个数据点到过滤结果中 filtered_data.append(data[0]) # 遍历剩余数据点,仅保留满足条件的数据 for i in range(1, len(data)): if diffs[i-1] <= threshold: filtered_data.append(data[i]) return filtered_data # 测试数据 data = [1.0, 1.1, 1.5, 3.0, 3.1, 3.2, 8.0, 9.0, 9.1] threshold = 1.0 # 设定差值阈值 filtered_result = abs_diff_filter(data, threshold) print("原始数据:", data) print("经过绝对差值滤波后的数据:", filtered_result) ``` 上述代码实现了如下功能: 1. **输入参数**: 数据列表 `data` 一个设定的阈值 `threshold`。 2. **核心逻辑**: 对每一组连续数据点计算它们的绝对差值,并判断是否小于等于给定的阈值。 3. **输出结果**: 将符合条件的数据点依次加入新的列表中返回。 运行以上代码后可以看到哪些数据因超出指定范围而被移除了[^1]。 --- #### 应用场景分析 这种基于绝对差值的排序与滤波方法非常适合应用于动态监测系统中的实时数据分析。例如,在工业自动化控制领域或者传感器网络环境中,它可以帮助消除由于外部干扰造成的瞬态误差,同时保持系统的响应速度不受影响。 需要注意的是,如果目标变量本身存在剧烈变动特性,则应谨慎调整阈值大小以免误删正常读数。此外还可以考虑引入更多高级统计指标(如标准偏差)作为辅助决策依据进一步优化性能表现[^2]。 --- #### 自适应扩展方案 为进一步提升鲁棒性适用性,可尝试构建一种自适应版本的绝对差值滤波器。即让阈值随时间窗口内的局部特征自动调节而非固定不变。比如取最近 N 个周期内所有差值的最大最小比例关系决定当前时刻允许的最大跳变幅度等等[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monkey_Men

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值