c/c++蓝桥杯经典编程题100道(10)二分查找

二分查找

->返回c/c++蓝桥杯经典编程题100道-目录


目录

二分查找

一、题型解释

二、例题问题描述

三、C语言实现

解法1:基础二分查找(难度★)

解法2:左边界查找(难度★★)

解法3:旋转数组查找(难度★★★)

四、C++实现

解法1:STL的binary_search(难度★)

解法2:自定义左边界查找(难度★★)

解法3:峰值查找(难度★★★)

五、总结对比表


一、题型解释

二分查找是一种在 有序数组 中快速查找目标值的高效算法。常见题型:

  1. 基础查找:在有序数组中判断目标值是否存在。

  2. 边界查找

    • 查找目标值的 第一个出现位置(左边界)。

    • 查找目标值的 最后一个出现位置(右边界)。

  3. 旋转数组查找:在部分有序的旋转数组中查找目标值。

  4. 峰值查找:在无序数组中找到任意一个峰值元素(比相邻元素大)。


二、例题问题描述

例题1:输入有序数组 [1, 3, 5, 7, 9] 和目标值 5,输出 true(存在)。
例题2:输入数组 [1, 2, 2, 2, 3] 和目标值 2,输出左边界 1 和右边界 3
例题3:输入旋转数组 [4, 5, 6, 7, 0, 1, 2] 和目标值 0,输出位置 4
例题4:输入数组 [1, 3, 5, 4, 2],输出任意一个峰值元素的索引(如 2 或 3)。


三、C语言实现

解法1:基础二分查找(难度★)

通俗解释

  • 像猜数字游戏,每次猜中间数,缩小一半范围。

c

#include <stdio.h>

int binarySearch(int arr[], int n, int target) {
    int left = 0, right = n - 1;     // 初始化搜索范围:整个数组
    while (left <= right) {          // 当范围有效时继续搜索
        int mid = left + (right - left) / 2; // 防止整数溢出
        if (arr[mid] == target) {    // 找到目标值
            return mid;
        } else if (arr[mid] < target) { // 目标值在右半部分
            left = mid + 1;          // 缩小左边界
        } else {                     // 目标值在左半部分
            right = mid - 1;         // 缩小右边界
        }
    }
    return -1; // 未找到
}

int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int target = 5;
    int index = binarySearch(arr, 5, target);
    printf("目标值位置:%d", index); // 输出 2
    return 0;
}

代码逻辑

  1. 初始化范围

### 关于二分查找算法蓝桥杯竞赛中的应用 #### 二分查找简介 二分查找,也称为折半查找(Binary Search),是在有序数组中查找特定元素的一种高效搜索算法。其核心思想在于通过每次将待查区间减半来快速定位目标值的位置[^4]。 #### 应用于蓝桥杯的具体实例解析 ##### 实例题目描述 假设有一典型的蓝桥杯题目如下: 给定一个按照升序排列的整数列表 `nums` 和一个目标数值 `target` 。编写一个函数实现二分查找算法,在该列表中寻找是否存在这个目标值;如果存在返回索引位置,否则返回 `-1` 表明未找到。 ##### Python代码实现 ```python def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 此段程序展示了如何利用Python语言具体实施上述提到的二分查找逻辑。 ##### 解题思路说明 为了应对这类基于二分查找的问题,建议采取以下策略: - **确认输入条件**:确保所处理的数据集已经按顺序排列。 - **边界情况考虑**:注意当数组为空或是只有一个元素时的行为。 - **循环不变量原则**:始终保持`left ≤ answer ≤ right`的关系,其中`answer`代表最终要找的目标下标。 - **退出机制设计合理**:一旦找到了匹配项立即终止循环,并返回相应结果;如果没有发现则输出预设失败标志(-1)。 #### 提高解题技巧的方法 对于准备参加蓝桥杯的学生来说,除了掌握基础理论外还需要注重实际操作能力的培养。多做历年的真题可以帮助熟悉考试模式以及提升解决问题的速度和准确性[^2]。同时,遇到难题不妨换个角度思考,比如采用逆向思维去探索解决方案的可能性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值