二分算法及其公式

news2024/11/27 18:44:50

二分查找

  • 二分查找是大多数人第一个接触到的算法,很多人都认为只有有序的数组可以使用二分查找,但这种思想其实是错误的,二分查找是可以用于拥有二段性的数组,而且二分算法是由模板做参考的,所以只要掌握就可以解决大多二分查找的问题

题目

请添加图片描述

class Solution {
public:

    //二分查找算法不一定是要使用严格的升序或者降序,只要区间可以划分为二段性就可以使用
    vector<int> searchRange(vector<int>& nums, int target) {
        //其实可以分别寻找第一个位置和最后一个位置
        int left = 0, right = nums.size()-1, sz = nums.size(), mid = 0;
        vector<int> ret;
        //寻找左边界
        while(left <= right){
            mid = left + (right-left+1)/2;
            if(nums[mid] == target && (mid == 0 || nums[mid-1] != target)){
                ret.emplace_back(mid);
                break;
            }

            if(nums[mid] > target || nums[mid] == target) right = mid-1;
            if(nums[mid] < target) left = mid+1;
        }
        //寻找右边界
        left = mid, right = nums.size()-1;
        while(left <= right){
            mid = left + (right-left+1)/2;
            if(nums[mid] == target && (mid == sz-1 || nums[mid+1] != target)){
                ret.emplace_back(mid);
                break;
            }

            if(nums[mid] > target) right = mid-1;
            if(nums[mid] < target || nums[mid] == target) left = mid+1;
        }

        if(ret.empty()){
            return {-1,-1};
        }

        return ret;
    }
};

​ 这是我最开始写的代码,最开始其实我不屑于看什么模板,感觉这些用if else 语句都可以解决,但多做了几道发现if else语句会让你的代码变得非常的臃肿,而且有一种面向测试用例编程的感觉,所以在在这里我想斗胆给各位好好讲一下二分查找算法

查找左端点

请添加图片描述

  • 首先,这里我们将区间分为小于和大于等于,这样二段性就出来了,你可能会问,为什么不划分为小于等于和大于这两个区间,因为我们查找的是左端点,划分为小于等于和大于还怎么找左端点

算法原理

  1. x  < t(target) left = mid +1 (这里可以=mid+1因为左区间划分是小于,所以最终结果一定不在左区间,所以left = mid + 1)
  1. x >= t  right = mid (这里不可以是 right = mid-1)因为如果right = mid-1的话很可能会出现right超出区间的情况,这样就会导致没法判断到结果

细节处理

  • 循环条件:

    • left < right

    为什么不是left <= right,大家可以看下图,如果此时ret > target这是就会执行第二种语句,right=mid,那就会造成死循环

请添加图片描述

  • 找中点的操作

    mid = left + (right-left)/2 这种情况是如果只有两个元素会找左边的那一个

    为什么不是 mid = left + (right-left+1)/2

    大家看下图如果是找右边的且nums[right]>=t那不是又会出现死循环吗。

请添加图片描述

寻找右端点

  • 这里的基本操作都是一样的,出了找中点还有算法(left与right的移动)不一样,所以不多赘述,各位可以自行画图处理,下面给大家一个模板,大家可以参考。

请添加图片描述

完整代码

class Solution {
public:
    //二分查找算法不一定是要使用严格的升序或者降序,只要区间可以划分为二段性就可以使用
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty()) return{-1, -1};
        //其实可以分别寻找第一个位置和最后一个位置
        int left = 0, right = nums.size()-1, sz = nums.size(), mid = 0, begin = 0;
        //寻找左边界
        while(left < right){
            mid = left + (right-left)/2;

            if(nums[mid] >= target) right = mid;
            if(nums[mid] < target) left = mid+1;
        }
        //判断
        if(nums[left] != target) return {-1, -1};
        begin = left;

        //寻找右边界
        right = nums.size()-1;
        while(left < right){
            mid = left + (right-left+1)/2;

            if(nums[mid] > target) right = mid-1;
            if(nums[mid] <= target) left = mid;
        }
        return {begin, right};
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【区块链+绿色低碳】基于区块链的双碳能源纳管平台 | FISCO BCOS应用案例

在双碳战略的指导下&#xff0c;南京区块链产业应用协会牵头研发的双碳能源纳管平台&#xff0c;依托区块链、人工智能、云计算、 物联网、大数据、工业互联网与边缘计算等技术&#xff0c;对绿电追溯、需求侧响应、能源微网、源网荷储、隔墙用电、 碳排放权认证、额度计量、预…

矩阵常见分解算法及其在SLAM中的应用

文章目录 常见特殊矩阵定义Cholesky分解&#xff08;正定Hermittian矩阵&#xff0c;分解结果唯一&#xff09;Cholesky分解应用 SVD分解&#xff08;将singularvalues排序后分解唯一&#xff09;SVD 分解的应用&#xff08;任意矩阵&#xff09; QR分解&#xff08;任意矩阵&a…

第六周:机器学习周报

机器学习周报 摘要Abstract机器学习——类神经网络训练不起来怎么办&#xff1f;1. 自动调整学习率&#xff08;learning rate&#xff09;1.1 特制化的Learning Rate——parameter dependent1.1.1 Root Mean Square&#xff08;RMS&#xff0c;均方根&#xff09;1.1.2 RMSPro…

【Python】基础语法(下)

本篇文章将接着上篇文章继续讲解基础语法&#xff1a; &#xff08;4&#xff09;变量 &#xff08;5&#xff09;注释 &#xff08;6&#xff09;输入 &#xff08;7&#xff09;条件语句 四&#xff1a;变量 变量其实就是我们生活中起别名和外号。让变量名指向某个值&a…

旅游卡,免费,旅游是真的吗?真相是……

但这种包来回大交通&#xff0c;一旦成本大于利润&#xff0c;他们就会以各种理由推卸责任。这就是我在“揭秘&#xff1a;共享旅游卡免费旅游&#xff0c;包来回路费&#xff0c;这背后的3大真相&#xff01;”这篇文章里面讲到那个大妈的惨痛教训。 以上这5点真相&#xff0…

Python 中的@符号:如何用装饰器改变你的编程方式?

Python 是一种强大且灵活的编程语言&#xff0c;其中有许多独特的语法元素和概念。 符号通常用于装饰器。它看起来可能有些神秘&#xff0c;但实际上它的工作原理非常简单。 什么是装饰器&#xff1f; 在了解 符号之前&#xff0c;我们首先需要理解什么是装饰器。简单来说&am…

C++设计模式笔记(内附可运行代码示例)

持续更新, 欢迎关注....... 前言 设计目的 高内聚&#xff0c;低耦合 设计原则 1、开放封闭原则 类的改动是通过增加代码进行&#xff0c;而不是修改源代码。 2、单一职责原则 职责单一&#xff0c;对外只提供一种功能&#xff0c;引起类变化的原因都应该只有一个。 3…

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.1PMBOK的发展与9.2项目基本要素

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

数据库设计效率提高的5大注意事项

数据库设计效率和质量的提高对项目影响深远&#xff0c;能够显著提升数据访问速度&#xff0c;确保数据一致性和完整性&#xff0c;减少应用开发和维护成本&#xff0c;同时提升系统稳定性和用户体验。如果数据库设计不佳会导致项目性能低下&#xff0c;数据访问缓慢&#xff0…

Java7.0标准之重要特性及用法实例(十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

APDL(ANSYS Parametric Design Language)初识

APDL&#xff08;ANSYS Parametric Design Language&#xff09;编写涉及使用ANSYS的参数化设计语言来创建、修改和执行有限元分析&#xff08;FEA&#xff09;任务。以下是一些关于APDL编写的基本步骤、技巧和示例&#xff1a; 一、基本步骤 了解APDL基础&#xff1a; 熟悉AP…

并发--快速查询死锁信息

使用jstack查看线程堆栈信息 jstack&#xff1a;jdk提供的一个工具&#xff0c;可以查看java进程中线程堆栈信息。 位于&#xff1a;jdk1.8.0_121\bin包下 死锁代码 public class DeadLockDemo {private static String A "A";private static String B "B"…

视频平台麓战奥运经济,谁能接住这“破天的富贵”?

文丨郭梦仪 与巴黎奥运会炸裂开幕式的“松弛感”不同&#xff0c;赛场外的流量之争早已硝烟弥漫。 今年&#xff0c;腾讯、咪咕、快手、抖音与中央广播电视总台达成奥运转播版权合作&#xff0c;长短视频平台各占一半。 而今&#xff0c;获得转播权的视频平台们&#xff0c;…

20240731 每日AI必读资讯

&#x1f4f1;苹果AI版iOS首日火爆&#xff1a;聊天秒变高情商&#xff0c;大模型成最强嘴替&#xff0c;Siri华丽变身 - 苹果的Apple Intelligence终于面世&#xff01;随着iOS 18.1 Beta版的上线&#xff0c;注册开发者从即日起就能体验到苹果AI的部分功能。 - Siri的全面换…

出行方案,智能推荐:用友BIP商旅云6.0推出AI新装备

随着企业业务的不断拓展和员工出行需求的日益复杂化&#xff0c;传统的商旅预订方式已经难以应对&#xff0c;同时企业在商旅成本控制方面也面临着巨大的挑战。为此用友BIP商旅云6.0推出了创新性的AI新装备——智能推荐&#xff0c;以智能分析与精准预测&#xff0c;为企业提供…

基于springboot的大学奖学金评定管理系统表结构调试讲解源码

基于springboot的大学奖学金评定管理系统 赠送自己录的运行教程视频&#xff0c;无经验也可以运行起来。 提供远程调试服务&#xff0c;加钱可远程帮忙运行起来。 项目功能: 二、项目功能介绍 管理员 个人中心&#xff1a;这是管理员的个人工作区域&#xff0c;允许管理员…

vue基础3

1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…

MSYS2下载安装和使用

Minimalist GNU&#xff08;POSIX&#xff09;system on Windows&#xff0c;Windows下的GNU环境。 目录 1. 安装 2. pacman命令 3. 配置vim 4. 一些使用示例 4.1 编译代码 4.2 SSH登录远程服务器 1. 安装 官网下载&#xff1a;https://www.msys2.org/ 双击.exe文件&am…

【python】OpenCV—Faster Video File FPS

文章目录 1、需求描述2、正常方法 cv2.read3、加速方法 imutils.video.FileVideoStream4、涉及到的核心库函数4.1、imutils.video.FPS4.2、imutils.video.FileVideoStream 5、参考 1、需求描述 使用线程和队列数据结构将视频文件的 FPS 速率提高 &#xff01; 我们的目标是将…

解决Qt3D程序场景中无法显示创建的立体图形?

有的新手在创建Qt3D程序时&#xff0c;因为不熟练&#xff0c;导致经常遇到无法显示3D图形的情况。 原因其实也简单&#xff0c;就是设置的摄像机的位置不对&#xff0c;或者压根没有设置摄像机。 // CameraQt3DRender::QCamera *cameraEntity view.camera();cameraEntity-&g…