酷代码 AI
菜单

题目描述 已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离 输入 第一行为两个整数<math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>m</mi> <mo>,</mo> <mi>n</mi> <mo stretchy="false">(</mo> <mn>1</mn> <mo>&#x2264;</mo> <mi>m</mi> <mo>,</mo> <mi>n</mi> <mo>&#x2264;</mo> <mn>1000</mn> <mo stretchy="false">)</mo> </math> ,分别代表数组f[], g[]的长度。 第二行有m个元素,为数组f[]。 第三行有n个元素,为数组g[]。 每个元素的数据范围在范围<math xmlns="http://www.w3.org/1998/Math/MathML"> <mo stretchy="false">[</mo> <mo>&#x221

数组的距离定义为两个有序数组中任意一对元素之差的绝对值的最小值。由于数组已经按升序排列,可以使用双指针法高效求解。 解题思路 维护两个指针分别指向两个数组的当前元素。比较两个元素的大小: - 若 `f[i] < g[j]`,则将 `i` 右移,因为更大的 `f[i]` 可能更接近 `g[j]` - 否则将 `j` 右移 在移动过程中不断更新最小绝对差。 代码实现(C++) ```cpp #include <iostream> #include <vector> #include <climits> #include <cmath> using namespace std; int main() { int m, n; cin >> m >> n; vector<long long> f(m), g(n); for (int i = 0; i < m; ++i) cin >> f[i]; for (int j = 0; j < n; ++j) cin >> g[j]; int i = 0, j = 0; long long minDiff = LLONG_MAX; while (i < m && j < n) { long long diff = abs(f[i] - g[j]); if (diff < minDiff) minDiff = diff; if (f[i] < g[j]) ++i; else ++j; } cout << minDiff << endl; return 0; } ``` 样例解析 输入: - f = [1, 4, 10] - g = [-1, 3, 7] 计算过程: - |1 - (-1)| = 2 - |1 - 3| = 2 - |4 - 3| = 1 ← 当前最小 - |4 - 7| = 3 - |10 - 7| = 3 最终输出最小值:1 时间复杂度:O(m + n) 空间复杂度:O(1) [2026-01-08 12:23:38 | AI问答 | 445点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多