修正有序数组二分查找程序,准确查找目标元素位置
### 🐞问题分析 原程序使用二分查找来在有序数组中查找等于 `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]
- 数轴旅行:从原点出发,能否到达目标位置?(字节豆包 | 225点数解答 | 2026-01-23 19:51:03)136
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)93
- jQuery 实现动态操作 DOM:打造可增删任务的待办事项列表应用(百度文心 | 1015点数解答 | 2024-10-26 23:41:22)515
- jQuery 打造实用待办事项列表:输入添加、点击删除一步到位!(阿里通义 | 1139点数解答 | 2024-10-29 08:44:48)437
- jQuery 实现动态操作 DOM:打造带添加与删除功能的待办事项列表应用(阿里通义 | 687点数解答 | 2024-10-29 09:25:06)444
- 公立医院破局:智慧报账系统契合财政部电子会计凭证试点的建设方案(阿里通义 | 628点数解答 | 2024-05-09 10:41:51)362
- 公立医院:借智慧报账系统接轨财政部电子凭证试点,开启财务高效新篇( | 765点数解答 | 2024-05-09 10:42:37)346
- 公立医院:借电子会计凭证试点东风,打造智慧报账系统新标杆!(百度文心 | 691点数解答 | 2024-05-09 10:43:49)347
- Python Tkinter 代码剖析:GUI 程序搭建与窗口居中函数解析(字节豆包 | 314点数解答 | 2024-08-02 14:49:22)388
- Java 实现对象适配器:让电能、光能发动机与发动机接口完美兼容(阿里通义 | 611点数解答 | 2024-10-28 17:34:06)312
- 巧用 CDN 搭建含照片轮播、社交链接与 AI 对话的单页个人网页(字节豆包 | 485点数解答 | 2024-10-28 23:31:13)306
- 巧用 CDN 搭建单页个人网页:含照片轮播、社交链接与 AI 对话界面 (阿里通义 | 1752点数解答 | 2024-10-28 23:32:45)311