排好序数组中查找特定元素下标程序的错误修正与优化
### 🐞问题分析 原程序使用二分查找来寻找等于 `k` 的元素的下标,但存在一个问题:当数组中有多个等于 `k` 的元素时,原程序找到任意一个等于 `k` 的元素就会停止查找,而要求是找到第一个等于 `k` 的元素的下标。当循环结束时,若没有在循环内找到等于 `k` 的元素,程序直接输出 `n + 1`,但此时可能 `l` 位置的元素恰好等于 `k`,而原程序没有进行这一步的判断。 ### 💡修改方案 我们可以对二分查找进行修改,当找到等于 `k` 的元素时,不立即停止查找,而是继续向左缩小查找范围,以找到第一个等于 `k` 的元素。在循环结束后,检查 `l` 位置的元素是否等于 `k`。 ### 📝修改后的代码 ```cpp #include <iostream> using namespace std; // 定义数组,数组最大长度为 100005 // n 表示数字的个数,k 表示要查找的数字 // l 和 r 是二分查找的左右边界,mid 是中间位置,ans 是最终答案 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; // 左边界初始化为 1 l = 1; // 右边界初始化为 n r = n; // 初始答案设为 n + 1,表示未找到 ans = n + 1; // 二分查找 while (l <= r) { // 计算中间位置 mid = (l + r) / 2; if (a[mid] >= k) { // 如果中间元素大于等于 k,更新答案并缩小右边界 if (a[mid] == k) ans = mid; r = mid - 1; } else { // 如果中间元素小于 k,缩小左边界 l = mid + 1; } } // 输出结果 cout << ans; return 0; } ``` ### 🧪代码解释 1. **初始化**:将数组 `a` 的元素输入,读取要查找的数字 `k`,并初始化二分查找的左右边界 `l` 和 `r` 分别为 `1` 和 `n`,初始答案 `ans` 设为 `n + 1`。 2. **二分查找**:在 `l <= r` 的条件下进行二分查找。计算中间位置 `mid`,如果 `a[mid] >= k`,说明目标元素可能在左半部分,更新 `ans` 并将 `r` 更新为 `mid - 1`;如果 `a[mid] < k`,说明目标元素在右半部分,将 `l` 更新为 `mid + 1`。 3. **输出结果**:输出最终答案 `ans`。 ### 📖复杂度分析 - **时间复杂度**:$O(log n)$,因为使用了二分查找。 - **空间复杂度**:$O(n)$,主要用于存储数组。 ######[AI问答 | 819点数解答 | 2026-08-09 21:15:09]
- C++ 高效计算序列中递增三元组数量:从 O(n^2) 到 O(n log n) 的优化之路(DeepSeek | 742点数解答 | 2025-02-25 18:35:56)336
- C++ 求解序列中递增三元组数量:动态规划实现与复杂度分析(DeepSeek | 631点数解答 | 2025-02-25 18:40:05)279
- Photoshop 错误 8800 大揭秘:原因分析与实用解决方案(DeepSeek | 349点数解答 | 2025-02-28 11:19:16)749
- MaxScript 导出模型长度到 CSV 文件:代码错误排查与修正全解析 (字节豆包 | 525点数解答 | 2025-07-09 15:37:45)278
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)93
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)436
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)388
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)160
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)151
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)126
- jQuery 实现动态操作 DOM:打造可增删任务的待办事项列表应用(百度文心 | 1015点数解答 | 2024-10-26 23:41:22)515
- jQuery 打造实用待办事项列表:输入添加、点击删除一步到位!(阿里通义 | 1139点数解答 | 2024-10-29 08:44:48)437