LeetCode 之二分法查找 Binary search

本文介绍了一种使用二分查找法解决寻找目标值范围的问题,并给出具体算法实现。此外,还提供了一种快速幂算法来计算x的n次方,针对不同情况进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Search for a Range

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

首先二分,然后根据二分的坐标往左,往右

int searchTarget(int A[], int start, int end, int target){
    if(start > end)
        return -1;
    else{
        int mid = (start+end)/2;
        if(A[mid] == target) return mid;
        if(A[mid]> target)
            return searchTarget(A,start,mid-1,target);
        if(A[mid]<target)
            return searchTarget(A,mid+1,end,target);
    }
}
vector<int> searchRange(int A[], int n, int target) {
    vector<int> result;
    int index = searchTarget(A,0,n-1,target);
    if(index == -1){
        result.push_back(-1);
        result.push_back(-1);
        return result;
    }
    else{
        int ls = index;
        while(ls>0 && A[index] == A[ls-1]) ls--;
        int rs = index;
        while(rs<n-1 && A[index] == A[rs+1]) rs++;
        result.clear();
        result.push_back(ls);
        result.push_back(rs);
    }
    return result;

}

该算法的最差复杂度为O(n), 但平均为O(logn).


2. Pow(x,n)

Implement pow(xn).

二分法,注意n<0的情况。

double power(double x, int n){
    if(n==0)
        return 1;
    double v = power(x,n/2);
    if(n%2 == 0)
        return v *v;
    else
        return v* v* x;
}
double pow(double x, int n) {
    if(n<0)
        return 1.0 / power(x,-n);
    else
        return power(x,n);
}

3. 未完待续
### C++ 中二分法查找的模板及其实现 #### 一、标准库中的 `binary_search` 函数 C++ STL 提供了内置函数 `std::binary_search` 来执行二分查找操作。此函数用于判断给定值是否存在于已排序范围内的某个位置[^1]。 ```cpp #include <algorithm> #include <vector> bool contains(const std::vector<int>& vec, int value) { return std::binary_search(vec.begin(), vec.end(), value); } ``` 该方法仅返回布尔类型的判定结果,并不提供具体的位置信息。为了获取目标元素的确切索引,可以考虑使用其他辅助工具如 `lower_bound` 或者自定义实现版本。 #### 二、基于迭代器的标准模板实现 下面展示了一个通用的二分查找模板,适用于任何支持随机访问迭代器的数据结构: ```cpp template<typename RandomIt, typename T> RandomIt binarySearch(RandomIt first, RandomIt last, const T& val) { while (first != last) { auto mid = next(first, distance(first, last) / 2); if (*mid < val) first = ++mid; else if (*mid > val) last = mid; else return mid; // 找到匹配项 } return last; // 未找到时返回最后一个位置 } ``` 这段代码实现了经典的二分查找逻辑,在有序区间 `[first, last)` 内寻找等于 `val` 的第一个元素并返回其对应的迭代器;如果不存在这样的元素,则返回指向区间的末端 (`last`)。 #### 三、递归方式下的二分查找 对于希望采用递归形式来编写二分查找的情况,这里给出了一种可能的设计方案: ```cpp int recursiveBinarySearch(int arr[], int low, int high, int key) { if (high >= low) { int mid = low + (high - low) / 2; // 如果找到了键值则返回下标 if (arr[mid] == key) return mid; // 若中间点大于要找的目标,则继续在左半部分搜索 if (arr[mid] > key) return recursiveBinarySearch(arr, low, mid - 1, key); // 否则向右子数组中查询 return recursiveBinarySearch(arr, mid + 1, high, key); } // 当low>high时表示没查到 return -1; } ``` 上述例子展示了如何利用递归来完成相同的功能,需要注意的是边界条件以及防止栈溢出等问题的发生[^2]。 #### 四、LeetCode 风格的应用实例 针对特定应用场景比如在线编程平台 LeetCode 上的任务需求,以下是简化版的解决方案之一: ```cpp class Solution { public: bool search(vector<int>& nums, int target) { int l = 0, r = size(nums)-1; while(l<=r){ int m=(l+r)/2; if(target==nums[m])return true; else if(target<nums[m])r=m-1; else l=m+1; } return false; } }; ``` 这个片段来源于实际竞赛题目解答过程,体现了简洁高效的编码风格[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值