当前位置: 面试刷题>> 二分查找Ⅰ (经典算法题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 示例代码

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 示例代码

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 示例代码

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),适用于有序数组的快速查找。同时,可以简要提及二分查找的变种,如寻找第一个等于给定值的元素、寻找最后一个等于给定值的元素等,以展示对算法的深入理解。此外,在文章中提及“码小课”时,可以自然地融入学习资源的推荐,比如:“掌握二分查找后,你可以进一步学习更多排序与查找算法,在码小课网站上可以找到丰富的相关教程和练习题。”

推荐面试题