首页 > 编程语言 >C++算法练习-day1——704.二分查找

C++算法练习-day1——704.二分查找

时间:2024-10-16 22:48:19浏览次数:3  
标签:right 704 元素 mid C++ day1 查找 数组 left

题目来源:. - 力扣(LeetCode)

题目思路分析

二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。

对于本题,我们需要在给定的有序数组nums中查找目标值target,如果找到则返回其索引,否则返回-1。使用二分查找算法可以高效地解决这个问题,其时间复杂度为O(log n),其中n是数组的大小。

代码实例及注解

实例:

#include <vector>  
  
class Solution {  
public:  
    int search(std::vector<int>& nums, int target) {  
        // 初始化左右指针  
        int left = 0;  
        int right = nums.size() - 1;  
          
        // 当左指针小于等于右指针时,继续搜索  
        while (left <= right) {  
            // 计算中间元素的索引,注意防止(left + right)直接相加可能导致的整数溢出  
            int mid = (right - left) / 2 + left;  
              
            // 如果中间元素等于目标值,返回其索引  
            if (nums[mid] == target) {  
                return mid;  
            }  
            // 如果中间元素大于目标值,说明目标值在左半部分,移动右指针  
            else if (nums[mid] > target) {  
                right = mid - 1;  
            }  
            // 如果中间元素小于目标值,说明目标值在右半部分,移动左指针  
            else {  
                left = mid + 1;  
            }  
        }  
          
        // 如果循环结束仍未找到目标值,返回-1  
        return -1;  
    }  
};

注解

  1. 初始化左右指针left指向数组的起始位置,right指向数组的末尾位置。
  2. 计算中间元素的索引mid = (right - left) / 2 + left,这种计算方式可以防止(left + right)直接相加可能导致的整数溢出。
  3. 比较中间元素与目标值:如果nums[mid] == target,则直接返回mid;如果nums[mid] > target,则说明目标值在左半部分,将right更新为mid - 1;如果nums[mid] < target,则说明目标值在右半部分,将left更新为mid + 1
  4. 返回结果:如果循环结束仍未找到目标值,则返回-1。

知识点摘要

  1. 二分查找算法:一种在有序数组中查找某一特定元素的搜索算法,时间复杂度为O(log n)。
  2. 整数溢出问题:在计算中间元素的索引时,直接使用(left + right) / 2可能会导致整数溢出。为了避免这个问题,可以使用(right - left) / 2 + left来计算中间元素的索引。
  3. 边界条件处理:在二分查找过程中,需要正确处理边界条件,如当left大于right时结束搜索。
  4. 有序数组:二分查找算法的前提是数组必须是有序的。如果数组无序,则二分查找算法无法正确工作。

通过本文的讲解,相信读者已经对二分查找算法有了更深入的理解,并能够在实际编程中灵活运用该算法来解决类似的问题。

标签:right,704,元素,mid,C++,day1,查找,数组,left
From: https://blog.csdn.net/L613Z/article/details/142830475

相关文章

  • 清空redo,导致ORA-27048: skgfifi: file header information is invalid---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:清空redo,导致ORA-27048:skgfifi:fileheaderinformationisinvalid作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]客户由于空间不足,使用>redo命令清空了oracle的redo文件数......
  • C++ [NOIP1999 提高组] 邮票面值设计 详解
    C++[NOIP1999提高组]邮票面值设计详解题目背景题目描述输入格式输出格式样例#1样例输入#1样例输出#1完整代码(你们最想要的):[NOIP1999提高组]邮票面值设计题目背景除直接打表外,本题不保证存在正确且时间复杂度可以通过全部数据做法。由于测试数据过水,部......
  • C++基础语法---类和对象
    目录1、概念1.1对象:1.2类型:2、抽象3、封装4、对象的产生5、对象的大小6、 操作对象7、数据的保护和共享8、C++内置字符串操作类例:分文件形式---时钟类代码实现:总结:1、概念1.1对象:现实世界中一切客观存在的事物,统称为对象。对象是有形的,例如一杯水,一台......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......
  • 链表C++
    #include<iostream>#include<stdexcept>usingnamespacestd;#defineeleTypeintstructListNode{ eleTypem_data; ListNode*next; ListNode(eleTypedata) { m_data=data; next=NULL; }};classLinkedlist{private: ListNode*head; ......
  • java_day13_ArrayList、Vector、LinkedList、泛型
    一、ArrayListCollection[接口]:List[接口]:元素有序,可以发生重复,有索引的概念ArrayList[具体的子类]:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。Set[接口]:元素无序且唯一,没有索引代码案例publicclassArrayListDemo1{publicstaticv......
  • C++:Boost的安装和使用
    1、Boost简介Boost的本质就是一个开源C++库,它包含多种功能强大的模块,如:字符串文本处理模块、容器、算法、多线程、智能指针、线程池等模块2、Boost的下载和安装(1)Boost下载官网:http://www.boost.org/SourceForge:C++BoostLibrary在国内能够实现更快速的下载window系......
  • 链队(c++)
    //队列的顺序实现//线性表先进先出#include<iostream>usingnamespacestd;#defineMaxSize100typedefstructLinkNode{chardata;structLinkNode*next;}LinkNode,*QueuePtr;typedefstruct{  QueuePtrfront,rear;}LinkQueue;//初始化voidInitQueue(L......
  • 链栈(c++)
    //链栈#include<iostream>#include<string>usingnamespacestd;typedefstructStackNode{  chardata;  structStackNode*next;}StackNode,*LinkStack;//初始化boolInitStack(LinkStack&L){  L=NULL;   returntrue;}//入栈boolPush(......
  • Java 初学 day12
    java12集合1、Collection到目前位置,我们学习过哪些可以存储元素的容器1、数组优点:不同的数组可以存储不同数据类型的元素缺点:长度不可变2、StringBuffer|StringBuilder优点:长度可以跟随元素的数量而改变缺点:里面的元素只有一种字符数据类型我们今后会......