二分查找

704. 二分查找

代码:

#include 
#include 
using namespace std;

class Solution {
public:
    int search(vector& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {  // 必须用 <= 确保所有元素都被检查
            int mid = left + (right - left) / 2;  // 防止整型溢出
            if (nums[mid] == target) {
                return mid;  // 找到目标值,返回索引
            } else if (nums[mid] < target) {
                left = mid + 1;  // 目标值在右侧
            } else {
                right = mid - 1; // 目标值在左侧
            }
        }
        return -1;  // 目标值不存在
    }
};

代码解释:

  1. 类定义

    class Solution { public: int search(vector& nums, int target) {
    • Solution 类中有一个公共成员函数 search,它接受一个 vector& nums(已排序的整数数组)和一个 int target(要查找的目标值)。
  2. 初始化左、右指针

    int left = 0, right = nums.size() - 1;
    • left 指针初始化为数组的第一个元素索引(0),right 指针初始化为数组的最后一个元素索引。
  3. 二分查找循环

    while (left <= right) { 
    • 这里使用 while (left <= right) 确保每个元素都被检查。如果 left 超过 right,说明整个数组已经被查找过一遍。
  4. 计算中间元素的索引

    int mid = left + (right - left) / 2;
    • 计算 mid,即当前查找区间的中间索引。这里使用 left + (right - left) / 2 计算中间值,防止 leftright 的和可能导致溢出。
  5. 判断目标值的情况

    if (nums[mid] == target) { return mid; }
    • 如果中间元素 nums[mid] 等于目标值 target,则返回当前的索引 mid
  6. 更新查找区间

    else if (nums[mid] < target) { left = mid + 1; /*目标值在右侧*/ } else { right = mid - 1; // 目标值在左侧 }
    • 如果中间元素小于目标值,说明目标值在右半部分,更新左指针 leftmid + 1
    • 如果中间元素大于目标值,说明目标值在左半部分,更新右指针 rightmid - 1
  7. 目标值不存在

    return -1;
    • 如果循环结束仍未找到目标值,返回 -1,表示目标值不在数组中

优点与好处:

  1. 高效的二分查找

    • 时间复杂度 O(log n):二分查找的主要优点是其高效性。在每次迭代中,都会将查找范围减少一半,因此它的时间复杂度是 O(log n),远远快于线性查找(O(n))。这个优势在处理大规模数据时尤为明显。
    • 空间复杂度 O(1):二分查找使用常数空间,因此它比其他查找算法(如线性查找或某些排序算法)更节省内存。
  2. 清晰的控制流

    • 代码结构清晰,通过简单的 while 循环和条件判断来不断调整 leftright 的值,使得逻辑非常容易理解。
    • 每次比较都直观地决定了查找范围的缩小,使得代码的可读性较好。
  3. 扩展性

    • 该方法实现了一个基础的二分查找,能够广泛应用于各种场景,比如查找目标值、查找目标值的插入位置等。你只需根据需求稍微调整即可。

总结:

这个 search 方法通过实现高效的二分查找算法,能够在一个有序的数组中快速找到目标值。它的优势在于计算效率(O(log n) 时间复杂度)和内存消耗(O(1) 空间复杂度)。同时,它还避免了整型溢出,使用了安全的 mid 计算方式,具有很好的可扩展性和清晰的代码结构。

你可能感兴趣的:(算法,算法)