leetcode每日一题——704. 二分查找

一、题目描述与要求

704. 二分查找

二、解题思路

  1. 定义两个指针 left 和 right,分别指向数组的起始位置和结束位置。
  2. 在每一次循环中,计算出中间位置 mid,通过 (right - left) / 2 + left 得到中间位置的索引。
  3. 获取中间位置的元素 num
  4. 将中间元素与目标值 target 进行比较:
    • 如果中间元素等于目标值,说明找到了目标值,返回中间位置 mid
    • 如果中间元素大于目标值,说明目标值应该在左半部分,将右指针 right 更新为 mid - 1
    • 如果中间元素小于目标值,说明目标值应该在右半部分,将左指针 left 更新为 mid + 1
  5. 循环继续执行,直到左指针 left 大于右指针 right,表示整个数组已经遍历完成但未找到目标元素。
  6. 返回 -1,表示目标元素不存在于数组中。

这种二分查找算法的时间复杂度为 O(logn),其中 n 是数组的长度。它利用了有序数组的特性,通过每次将查找范围缩小一半的方式快速定位目标值。

三、具体代码(C++)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = (right - left) / 2 + left;
            int num = nums[mid];
            if (num == target) {
                return mid;
            } else if (num > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
};

这段代码是一个二分查找算法,用于在有序数组中查找目标值。算法首先定义了左指针left和右指针right,分别指向数组的首尾元素。然后通过while循环,在数组范围内进行二分查找。每次取中间元素的索引mid,并将该索引对应的值num与目标值target进行比较。如果相等,则返回该索引;如果num大于target,则说明目标值在左半部分,将right指针更新为mid-1;如果num小于target,则说明目标值在右半部分,将left指针更新为mid+1。循环直到找到目标值或者left大于right时退出循环,最后返回-1表示未找到目标值。

该算法的时间复杂度为O(logn),其中n是数组的长度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值