二分查找-I 题解(牛客官方模板版)
题目基本信息
-
题目名称:二分查找-I
-
题目描述:
给定一个元素升序的、无重复数字的整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标(从 0 开始),否则返回 -1。 -
输入输出:牛客平台会自动处理输入输出并调用指定函数,考生只需实现模板中的函数即可。
-
约束:
- 数组长度:[0, 10000]
- 数组元素及 target 值范围:[-9999, 9999]
- 数组严格升序、无重复元素
-
样例:
- 输入:nums = [-1,0,3,4,6,10,13,14], target = 13 → 输出:6
- 输入:nums = [], target = 3 → 输出:-1
- 输入:nums = [-1,0,3,4,6,10,13,14], target = 2 → 输出:-1
解题思路
经典二分查找,利用数组有序性不断将搜索区间折半。
核心步骤:
- 定义左右指针
left = 0,right = nums.length - 1(Rust/Java/C++ 长度表示不同)。 - 当
left <= right时循环:- 计算中间位置
mid = left + (right - left) / 2(防止溢出)。 - 若
nums[mid] == target,直接返回mid。 - 若
nums[mid] < target,目标在右侧,left = mid + 1。 - 若
nums[mid] > target,目标在左侧,right = mid - 1。
- 计算中间位置
- 循环结束仍未找到,返回 -1。
图解示例(nums = [-1,0,3,4,6,10,13,14], target = 13)
| 步骤 | left | right | mid | nums[mid] | 比较 | 操作 | 剩余区间 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 7 | 3 | 4 | 4 < 13 | left = 4 | [6,10,13,14] |
| 2 | 4 | 7 | 5 | 10 | 10 < 13 | left = 6 | [13,14] |
| 3 | 6 | 7 | 6 | 13 | 相等 | 返回 6 | - |
代码实现
C++
class Solution {
public:
/**
*
* @param nums int整型vector
* @param target int整型
* @return int整型
*/
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left
京公网安备 11010502036488号