酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

修正有序数组二分查找程序,准确查找目标元素位置

### 🐞问题分析 原程序使用二分查找来在有序数组中查找等于 `k` 的数字的位置,但存在几个问题: 1. **二分查找边界更新错误**:当 `a[mid] < k` 时,应该更新 `l = mid + 1`;当 `a[mid] > k` 时,应该更新 `r = mid - 1`。原程序直接将 `l` 或 `r` 更新为 `mid` 会导致死循环,因为 `mid` 可能会一直不变。 2. **未考虑重复元素**:原程序找到一个等于 `k` 的元素就直接跳出循环,没有考虑到可能存在多个等于 `k` 的元素,我们需要找到第一个等于 `k` 的元素。 ### ✅修正后的代码 ```cpp #include <iostream> using namespace std; int a[100005], n, k, l, r, mid, ans; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } cin >> k; l = 1; r = n; ans = n + 1; while (l <= r) { mid = (l + r) / 2; if (a[mid] >= k) { if (a[mid] == k) { ans = mid; } r = mid - 1; // 更新右边界 } else { l = mid + 1; // 更新左边界 } } cout << ans; return 0; } ``` ### 💡代码解释 1. **输入部分**:首先读取数组的长度 `n`,然后读取数组的每个元素,最后读取要查找的数字 `k`。 2. **二分查找**: - 初始化左边界 `l` 为 1,右边界 `r` 为 `n`,答案 `ans` 为 `n + 1`。 - 当 `l <= r` 时,计算中间位置 `mid`。 - 如果 `a[mid] >= k`,说明目标元素可能在左半部分,更新右边界 `r = mid - 1`,如果 `a[mid] == k`,更新 `ans = mid`。 - 如果 `a[mid] < k`,说明目标元素在右半部分,更新左边界 `l = mid + 1`。 3. **输出结果**:最后输出 `ans`。 ######[AI问答 | 624点数解答 | 2026-08-09 21:22:09]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]