数列差异的最小化 | 豆包MarsCode AI刷题

249 阅读3分钟

题目解析

题目描述: 给定两个整数数列 ab,长度分别为 nm,以及一个整数 k。目标是找到一个公式的最小值: (a[i]b[j])2k2\left| (a[i] - b[j])^2 - k^2 \right|, 其中 0i<n,0j<m0 \leq i < n, 0 \leq j < m

约束条件

  • 1n,m1051 \leq n, m \leq 10^5
  • 0k1090 \leq k \leq 10^9
  • 0a[i],b[j]1090 \leq a[i], b[j] \leq 10^9

测试样例

  • 输入:n = 5, m = 5, k = 1, a = [5, 3, 4, 1, 2], b = [0, 6, 7, 9, 8] 输出:0
  • 输入:n = 5, m = 5, k = 0, a = [5, 3, 4, 1, 2], b = [0, 6, 7, 9, 8] 输出:1

解题思路

  1. 问题分析
    公式核心是 (a[i] - b[j])^2 - k^2,取绝对值后求最小值。通过公式对称性,可以将问题简化为寻找两个数列元素平方差的最小绝对值。

  2. 优化目标

    • 朴素解法需 O(n×m)O(n \times m) 遍历所有 a[i]a[i]b[j]b[j],在数据量较大时不可行。
    • 利用排序 + 二分查找优化到 O((n+m)log(m))O((n + m) \log(m))
  3. 解法步骤

    • 对数组 b 进行排序以便快速查找。
    • 遍历数组 a,对于每个 a[i],计算平方目标值 k2+a[i]2k^2 + a[i]^2a[i]2k2a[i]^2 - k^2
    • 使用二分查找定位 b 中最接近目标值的元素,计算公式最小值并更新结果。

代码实现

from bisect import bisect_left

def min_formula_value(n, m, k, a, b):
    b.sort()
    min_diff = float('inf')
    k2 = k * k

    for ai in a:
        ai2 = ai * ai
        target1, target2 = ai2 + k2, ai2 - k2

        # Find the closest value to target1 and target2 in b using binary search
        for target in (target1, target2):
            pos = bisect_left(b, target ** 0.5)  # Find position of closest square root
            if pos < m:
                min_diff = min(min_diff, abs((ai - b[pos])**2 - k2))
            if pos > 0:
                min_diff = min(min_diff, abs((ai - b[pos - 1])**2 - k2))

    return min_diff

# Example usage
n = 5
m = 5
k = 1
a = [5, 3, 4, 1, 2]
b = [0, 6, 7, 9, 8]

print(min_formula_value(n, m, k, a, b))  # Output: 0

知识总结

1. 排序和二分查找

本题利用数组排序结合二分搜索快速定位最接近目标值的元素,从而避免暴力搜索,极大地提升效率。

2. 对称性简化

通过公式对称性,将 xk2=x+k2|x - k^2| = |x + k^2| 的计算分解为两个方向的搜索,减少冗余计算。

3. 高效计算技巧

通过平方根近似定位,提高查找准确性,同时保持时间复杂度的可控性。


学习计划

1. 刷题计划

每周选择 5 道经典算法题,涵盖不同主题(如二分查找、动态规划、排序),逐步强化问题求解能力。

2. 错题分析

利用 MarsCode 的题目历史功能,针对错误记录详细原因并反复练习,确保每个知识点掌握到位。

3. 高效学习方法

结合 MarsCode 提供的自动评测和多维度数据反馈,快速识别薄弱环节,并有针对性地提高。


工具运用

1. MarsCode AI 的优势

  • 全面题库:涵盖经典算法、数据结构和综合应用题。
  • 实时解析:提供注释和代码细节,帮助用户快速理解。

2. 与其他资源结合

  • 使用算法书籍(如《算法导论》)辅助理论学习。
  • 配合 LeetCode 或 HackerRank 题目,拓展实战经验。

给其他用户的建议

  • 初学者:从基础题型入手,逐步提高难度,注重理解题目逻辑。
  • 进阶者:关注优化技巧,尤其是排序和二分查找等高效算法。
  • 实践者:结合实际场景,尝试将刷题思路应用到工作项目中。

通过 MarsCode AI 的持续练习和总结,将有效提升算法和编程能力!