当前位置: 面试刷题>> 二分查找Ⅰ (经典算法题500道)
### 题目描述
**二分查找Ⅰ**
给定一个升序排列的整数数组 `nums` 和一个整数 `target`,请编写一个函数,使用二分查找算法在数组中查找 `target`。如果数组中存在这个整数,则返回它的索引;如果不存在,则返回 `-1`。
**注意**:
- 假设数组中不存在重复的元素。
- 数组中的元素已按照升序排列。
### 示例
```
输入: nums = [-1, 0, 3, 5, 9, 12], target = 9
输出: 4
解释: 9 在数组中的索引为 4
输入: nums = [-1, 0, 3, 5, 9, 12], target = 2
输出: -1
解释: 2 不在数组中
```
### PHP 示例代码
```php
function search($nums, $target) {
$left = 0;
$right = count($nums) - 1;
while ($left <= $right) {
$mid = $left + floor(($right - $left) / 2);
if ($nums[$mid] == $target) {
return $mid;
} elseif ($nums[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
return -1;
}
// 测试用例
$nums = [-1, 0, 3, 5, 9, 12];
$target = 9;
echo search($nums, $target); // 输出 4
```
### Python 示例代码
```python
def search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 测试用例
nums = [-1, 0, 3, 5, 9, 12]
target = 9
print(search(nums, target)) # 输出 4
```
### JavaScript 示例代码
```javascript
function search(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
// 测试用例
const nums = [-1, 0, 3, 5, 9, 12];
const target = 9;
console.log(search(nums, target)); // 输出 4
```
### 逻辑添加
在回答这道题目时,我们不仅要提供清晰的解题思路和代码实现,还可以结合面试场景,提到二分查找算法的时间复杂度为 O(log n),适用于有序数组的快速查找。同时,可以简要提及二分查找的变种,如寻找第一个等于给定值的元素、寻找最后一个等于给定值的元素等,以展示对算法的深入理解。此外,在文章中提及“码小课”时,可以自然地融入学习资源的推荐,比如:“掌握二分查找后,你可以进一步学习更多排序与查找算法,在码小课网站上可以找到丰富的相关教程和练习题。”