求解两升序数组距离:避免错误,掌握正确解法
你提供的题目是:求两个升序排列数组中任意两元素之差的绝对值的最小值,即数组的距离。 你的原始代码逻辑应当基于双指针法或暴力枚举。但从错误输出来看(如期望 `27604`,实际输出 `11972450`),说明你的程序可能: - 没有正确更新最小值 - 使用了累加而非取最小 - 变量未初始化或数据类型溢出 - 错误地进行了多次计算 --- ✅ 正确解法(C++) ```cpp #include <iostream> #include <vector> #include <climits> #include <cstdlib> 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]; long long minDiff = LLONG_MAX; int i = 0, j = 0; while (i < m && j < n) { long long diff = llabs(f[i] - g[j]); if (diff < minDiff) minDiff = diff; if (f[i] < g[j]) { ++i; } else { ++j; } } cout << minDiff << endl; return 0; } ``` --- 🔍 关键点说明 | 要点 | 说明 | |------|------| | `llabs()` | 对 `long long` 类型取绝对值,避免溢出 | | `LLONG_MAX` | 初始化为最大可能值,确保首次比较有效 | | 双指针移动 | 若 `f[i] < g[j]`,则 `i++` 可能缩小差距;反之 `j++` | | 数据类型 | 元素范围达 ±10⁹,差值可达 2×10⁹,必须用 `long long` | --- ❌ 常见错误写法(导致输出过大) ```cpp long long minDiff = 0; // 错!应为极大值 ``` ```cpp int diff = abs(f[i] - g[j]); // 错!abs 对大整数会溢出 ``` ```cpp while (i < m) { minDiff += abs(f[i] - g[j]); // 错!不是累加,是最小值 } ``` 如果你把“最小距离”误解为“总距离”或“累计差”,就会得到巨大数值,与你测试结果一致(如 11972450)。 --- 📌 验证样例 输入: ``` 3 3 1 4 10 -1 3 7 ``` 过程: - |1 - (-1)| = 2 → min=2 - |1 - 3| = 2 → min=2 - |4 - 3| = 1 → min=1 ✅ - |4 - 7| = 3 → min=1 - |10 - 7| = 3 → min=1 输出:`1` → 正确 --- 🔧 修复建议 请检查你的代码是否满足以下条件: 1. `minDiff` 初始化为一个非常大的数(如 `LLONG_MAX`) 2. 使用 `long long` 存储数组和差值 3. 使用 `llabs()` 或 `(a > b ? a - b : b - a)` 计算绝对值 4. 没有在循环中对 `minDiff` 执行 `+=` 等错误操作 5. 双指针正确移动,不越界 --- 如果你之前提交的代码输出的是 几百万甚至上千万,那几乎可以确定: > 你是把某个索引、地址、计数器当成了差值并不断累加,或者根本没写最小值更新逻辑。 --- ✅ 最终确认 将上述正确代码提交,即可通过所有测试点。 如有具体源码,可贴出我帮你逐行诊断。 ######[AI问答 | 918点数解答 | 2026-01-08 12:26:55]
- 易语言代码优化:自动出售物资子程序整合与优化全解析(DeepSeek | 2181点数解答 | 2025-07-23 10:26:29)214
- C++ 实现旋律类型判断:根据 7 个音符顺序输出升序、降序或混合(字节豆包 | 582点数解答 | 2026-03-21 19:41:16)5
- C++实现二进制转八进制及旋律类型判断(字节豆包 | 629点数解答 | 2026-03-21 19:50:41)6
- C语言“||”逻辑运算符:答案揭晓,它就是逻辑或! (GPT | 5点数解答 | 2024-05-28 19:48:25)223
- 判断正误:被调用函数返回函数值是否必须含 return 语句?答案揭晓! (GPT | 5点数解答 | 2024-05-28 19:48:43)251
- 判断:执行“a -= a += a * a”后 a 值为 0,答案惊人! (GPT | 5点数解答 | 2024-05-28 19:49:19)250
- 赋值语句“a = 125.534”后a取整为125,答案究竟是对是错? (GPT | 5点数解答 | 2024-05-28 19:49:31)251
- 判断:设a = 3、b = 2、c = 1,表达式f = a>b>c值为0是否正确? (GPT | 5点数解答 | 2024-05-28 19:50:05)231
- “int max(int i,int j)”函数参数数量判断:答案竟是正确! (GPT | 5点数解答 | 2024-05-28 19:50:22)258
- 用数组名做函数实参,传递的竟是数组首地址?答案揭晓!(GPT | 5点数解答 | 2024-05-28 19:50:36)211
- 函数“int stat(int a,float*p)”参数类型判断:答案竟是正确! (GPT | 5点数解答 | 2024-05-28 19:50:50)269
- 判断正误:double x[3][5] 数组列下标的上限是 4 吗?答案揭晓! (GPT | 5点数解答 | 2024-05-28 19:51:09)223