酷代码 AI
菜单
服务商

C++二分查找实现“小于k的最大元素”详细解法与开发建议

好的,这是一个经典的 **二分查找** 应用问题。 题目要求找到“小于 k 的最大元素”。由于数组已经 **从小到大排好序**,我们可以通过二分查找快速定位到这个元素。 ## 🧩 解题思路 1. 数组已经有序,适合用二分查找。 2. 我们不是找 `k` 本身,而是找 **小于 `k` 的最大元素**。 3. 在二分过程中: - 如果 `arr[mid] < k`,说明这个元素 `arr[mid]` 是一个候选答案,**继续向右找**(因为右边可能有更大的但仍然小于 `k` 的元素)。 - 如果 `arr[mid] >= k`,说明当前值太大了,**向左收缩**。 4. 最终 `left - 1` 的位置就是我们要找的答案(因为循环结束后 `arr[left]` 是第一个 >= k 的元素)。 ## 🧪 代码实现(C++) ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, k; cin >> n; vector<int> arr(n); for (int i = 0; i < n; ++i) { cin >> arr[i]; } cin >> k; int left = 0, right = n - 1; int ans = -1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] < k) { ans = arr[mid]; // 更新候选答案 left = mid + 1; // 继续向右找更大的 } else { right = mid - 1; // 向左找 } } cout << ans << endl; return 0; } ``` ## ✅ 代码说明 - **`left = 0, right = n - 1`**:标准二分查找的左右边界。 - **`while (left <= right)`**:保证所有元素都被检查过。 - **`mid = left + (right - left) / 2`**:防止整数溢出,安全取中间值。 - **`arr[mid] < k`**:如果满足条件,记录当前值并向右搜索更大值。 - **最终输出 `ans`**:即为小于 `k` 的最大元素。 ## 📋 运行示例 **样例 1:** ``` 输入: 5 1 2 3 4 5 3 输出: 2 ``` **样例 2:** ``` 输入: 4 1 3 5 7 9 输出: 7 ``` ## 🔧 开发建议 1. **边界情况考虑**:题目保证存在这样的元素,所以 `ans` 一定会有值。但在通用代码中,可以加上 `if (ans == -1)` 的处理。 2. **输入优化**:如果数据量较大(如 `n=100000`),可以使用 `ios::sync_with_stdio(false); cin.tie(nullptr);` 提升输入速度。 3. **代码可读性**:建议将二分查找逻辑封装成一个函数,例如 `int findLessThanK(const vector<int>& arr, int k)`,便于复用。 4. **防止溢出**:`mid = left + (right - left) / 2` 是安全写法,比 `(left+right)/2` 更可靠。 --- ######[AI写代码神器 | 754点数解答 | 2026-05-29 19:27:44]

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