当前位置: 首页 > news >正文

二分查找-I(C++)

目录

1 问题描述

1.1 示例1

1.2 示例2

1.3 示例3

2 解题思路

2.1 二分查找法

3 代码实现

4 代码解析

4.1 初始化

4.2 二分法查找

4.3 返回结果

5 总结


1 问题描述

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

数据范围:0≤len(nums)≤2×1050≤len(nums)≤2×105 , 数组中任意值满足 ∣val∣≤109∣val∣≤109

进阶:时间复杂度 O(log⁡n)O(logn) ,空间复杂度 O(1)O(1)

1.1 示例1

输入:

[-1,0,3,4,6,10,13,14],13

返回值:

6

说明:

13 出现在nums中并且下标为 6     

1.2 示例2

输入:

[],3

返回值:

-1

说明:

nums为空,返回-1     

1.3 示例3

输入:

[-1,0,3,4,6,10,13,14],2

返回值:

-1

说明:

2 不存在nums中因此返回 -1    

2 解题思路

首先,定义左右边界 leftright,并进行边界检查,若数组为空,则直接返回 -1。接着,进入 while 循环,采用二分查找法进行搜索。mid 计算方式为 left + (right - left + 1) / 2,确保 mid 更靠近右侧,以防止死循环。当 nums[mid] 小于等于 target 时,说明目标值可能在 mid 及其右侧,因此 left = mid;否则,缩小搜索范围,将 right 设为 mid - 1。循环结束后,检查 nums[left] 是否等于 target,若相等返回索引 left,否则返回 -1

2.1 二分查找法

当数组的长度为奇数时:

当数组的长度为偶数时:

3 代码实现

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

4 代码解析

4.1 初始化

    int left = 0;
    int right = nums.size() - 1;
    if (right == -1) return -1;

初始化左右边界:left = 0right = nums.size() - 1,表示搜索范围是整个数组。

特殊情况处理:如果 right == -1,说明数组为空,直接返回 -1

4.2 二分法查找

        while(left < right)
        {
            int mid = left + (right - left + 1)/2;
            if(nums[mid] <= target)
            {
                left = mid;
            }
            else {
                right = mid - 1;
            }
        }

使用右偏二分查找,mid 取右侧值,确保 left 指向 target 可能存在的位置。若 nums[mid] <= target,更新 left = mid,否则缩小 right = mid - 1,逐步缩小搜索范围,最终确定 target 的位置。

4.3 返回结果

    if (nums[left] == target) return left;
    else return -1;

如果 nums[left] == target,说明找到了 target,返回索引 left。否则,说明 target 不存在,返回 -1

5 总结

代码使用右偏二分查找,mid 取右侧值,确保 left 指向 target 可能存在的位置。nums[mid] ≤ target 时,left = mid,否则 right = mid - 1,逐步缩小搜索范围。然而,while(left < right) 可能导致 left 无法有效更新,出现死循环。因此,更安全的做法是使用 left <= right 作为循环条件,并调整 mid 计算方式,以确保二分查找能够正确收敛,提高算法的稳定性和可靠性。

相关文章:

  • 平台建站/抖音seo优化系统招商
  • 使用angularjs的网站/免费推广的途径与原因
  • 永信南昌网站建设/东莞营销型网站建设
  • 网站设计开发文档模板/网络推广平台都有哪些
  • 有没有做任务赚钱的网站/热点营销案例
  • 【通俗讲解电子电路】——从零开始理解生活中的电路(二)
  • Tomcat部署
  • 无问西东、继续前行!!
  • 机器学习预备知识
  • Leetcode1 两数之和 python两种方法实现
  • 基于SpringBoot的绿城郑州爱心公益网站设计与实现现(源码+SQL脚本+LW+部署讲解等)
  • ASP.NET MVC项目部署到IIS后,w3wp.exe程序报错重启
  • 【服务治理中间件】consul介绍和基本原理
  • 《玩转AI大模型:从入门到创新实践》(12)LLM初步(2)
  • C++ final和override
  • Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例
  • yarn application命令中各参数的详细解释
  • 物以类聚的Kmeans:数据分群的暴力美学
  • 知识库适配DeepSeek,企业微信支持自动登录,授权支持过期时间设置,zyplayer-doc 2.4.9 发布啦!
  • C语言:整数、浮点数在内存中的存储
  • AWS Glue用Python Shell从Workday系统将人力资源原始数据以Parquet格式存入S3
  • LVS+Keepalived高可用高性能负载实战
  • 【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
  • 计算机毕业设计SpringBoot+Vue.js企业OA管理系统(源码+文档+PPT+讲解)
  • Linux《基础开发工具(上)》