C++二分查找实现:在有序数组中查找目标数字的位置
好的,我们来编写这个程序。这是一个典型的二分查找问题。 ## 🎯 问题分析 题目要求: - 输入:已排序的 `n` 个不同整数,以及一个目标值 `k` - 输出:`k` 在数组中的位置(从 1 开始计数),若不存在则输出 `n+1` **关键点**: - 数组已排序(从小到大) - 数字各不相同 - 数据规模 `n <= 100000`,二分查找效率为 O(log n),完全可行 ## 💻 C++ 代码实现 ```cpp #include <iostream> #include <vector> using namespace std; int binarySearch(const vector<int>& arr, int n, int k) { int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; // 防止溢出 if (arr[mid] == k) { return mid + 1; // 返回位置(从1开始) } else if (arr[mid] < k) { left = mid + 1; } else { right = mid - 1; } } // 未找到,返回 n+1 return n + 1; } int main() { int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } int k; cin >> k; int result = binarySearch(arr, n, k); cout << result << endl; return 0; } ``` ## 🔍 代码解释 | 部分 | 说明 | |------|------| | `left = 0, right = n - 1` | 初始化查找区间为整个数组 | | `mid = left + (right - left) / 2` | 计算中间索引,防止 `(left+right)` 溢出 | | `arr[mid] == k` | 找到目标,返回 `mid + 1`(题目要求位置从1开始) | | `arr[mid] < k` | 目标在右半部分,收缩左边界 | | `arr[mid] > k` | 目标在左半部分,收缩右边界 | | 返回 `n + 1` | 未找到时的输出要求 | ## 🧪 验证示例 **示例 1**: ``` 输入: 5 1 2 3 4 5 3 过程: mid=2 -> arr[2]=3 == k -> 返回 2+1=3 输出:3 ``` **示例 2**: ``` 输入: 4 1 3 5 7 5 过程: mid=1 -> arr[1]=3 < 5 -> left=2 mid=2 -> arr[2]=5 == k -> 返回 2+1=3 输出:3 ``` **未找到的情况**: ``` 输入: 3 10 20 30 25 过程: 最终 left>right,退出循环 返回 n+1 = 4 输出:4 ``` ## ⚠️ 开发建议与注意事项 1. **防止整数溢出**:使用 `mid = left + (right - left) / 2` 而不是 `mid = (left + right) / 2`,当 `left` 和 `right` 都很大时后者可能溢出。 2. **注意索引转换**:数组索引从 0 开始,题目要求位置从 1 开始,返回时要加 1。 3. **边界条件处理**:`while (left <= right)` 这个条件很关键——当 `left == right` 时依然需要检查最后一个元素。 4. **题目特殊输出**:不存在时输出 `n+1` 而非常见的 `-1`,这点容易忽略。 5. **输入优化**:如果数据量更大(超过 10^5),建议使用 `ios::sync_with_stdio(false);` 和 `cin.tie(nullptr);` 加速输入。 ######[AI写代码神器 | 910点数解答 | 2026-05-29 19:25:28]
- C++ 实现:精准统计给定范围 [L, R] 内数字 2 出现的次数及代码详解(字节豆包 | 401点数解答 | 2026-02-05 21:17:05)77
- C++实现:统计[L, R]范围内数字2出现的次数及代码详解(字节豆包 | 489点数解答 | 2026-02-07 17:12:26)94
- 数轴旅行:从原点出发,能否到达目标位置?(字节豆包 | 225点数解答 | 2026-01-23 19:51:03)72
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)400
- Python:用正则表达式从含多种字符的字符串中提取英文、数字和中文单词(GPT | 522点数解答 | 2024-05-31 19:05:27)346
- Python:用正则表达式结合 split 思路提取一行字符串中的英文、数字和中文单词 (GPT | 399点数解答 | 2024-05-31 19:07:31)346
- 繁体字编码代码修改:人物名字合法性验证函数转简体版(字节豆包 | 325点数解答 | 2024-10-21 18:57:01)318
- 计算区间 n 到 m 中数字 x 出现次数的 Python 实现与详解(字节豆包 | 289点数解答 | 2025-12-07 17:14:59)111
- Python 实现:计算区间 n 到 m 中数字 x 出现的次数(字节豆包 | 322点数解答 | 2025-12-13 21:37:08)112
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)40
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)365
- 公立医院破局:智慧报账系统契合财政部电子会计凭证试点的建设方案(阿里通义 | 628点数解答 | 2024-05-09 10:41:51)332