【算法】二分查找(红绿灯法)

引言

该方法来自b站算法大师兄,可用作通用模版处理二分查找问题,不用特意考虑边界临界值等情况。

方法描述

在这里插入图片描述
红色节点是小于target,绿色节点是大于等于target。
我们首先定义两个下标代表左和右,分别为-1和n。然后用红箭头和绿箭头分别指向这两个位置,然后计算中点用(left+right)/2,注意这里需要向下取整。然后判断中点位置是否是大于等于target,如果是我们就让它变为绿色,然后绿色箭头指向中点。如果不是,就把它变成红色让红色箭头指向它。如此循环知道left+1<right为止。

例题

leetcode35.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。
示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left=-1,right=nums.size();
        while(left+1<right)
        {
            int mid=(left+right)/2;
            auto lfunc=[&](){
                return nums[mid]>=target;
            };
            if(lfunc())
                right=mid;
            else
                left=mid;
        }
        return right;
    }
};

我们把判断是否是绿色节点设置成了lambda表达式形式,最后返回的值是第一个绿色节点的值。
如果找不到则该值肯定是等于n的,正好是插入位置,如果找得到,该值正好是第一个绿色节点下标即要查找的值。

leetcode.704.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

class Solution {
public:
    int binary_search(vector<int> nums,int target)
    {
        int l=-1,r=nums.size();
        
        while(l+1<r)
        {
            int mid=(r+l)/2;
            if([&](){
                return nums[mid]>=target;
            }())
                r=mid;
            else
                l=mid;
        }
        return r;
    }
    int search(vector<int>& nums, int target) {
        int idx=binary_search(nums,target);
        if(idx==nums.size()||nums[idx]!=target)
            return -1;
        return idx;
        
    }
};

这里我们干脆对二分进行了封装,最后返回的idx值是二分查找的下标,如果查找的元素大于所有元素,则返回n,否则返回第一个绿色节点的值,然后判断这个位置的值是否等于target,如果不等于则返回-1,否则返回idx。

leetcode34.在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

class Solution {
public:
    int binary_search(vector<int>& nums,int target)
    {
        int left=-1,right=nums.size();
        while(left+1<right)
        {
            int mid=(left+right)/2;
            if([&](){
                return nums[mid]>=target;
            }())
                right=mid;
            else
                left=mid;   
        }
        return right;
    }

    vector<int> searchRange(vector<int>& nums, int target) {
        int index=binary_search(nums,target);
        if(nums.size()==index||nums[index]!=target)
            return {-1,-1};
        int index2=binary_search(nums,target+1);
            return {index,index2-1};
    }
};

这里我们采用的思路是先查找target元素找出如果找不到则返回-1,如果找到则是找到target出现的第一个元素。然后查找target+1出现的第一个位置。然后返回即可。

总结

该方法提供了一种模版供解决二分查找问题,以此记录方便复习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

干货必读: 测试开发既然都这么厉害了!为啥不直接转业务开发?

前段时间&#xff0c;在后台收到一则留言&#xff1a;“请问一下&#xff0c;你觉得开发技术好&#xff0c;还是测试技术好&#xff0c;如果测试技术好&#xff0c;为什么不直接开发&#xff0c;干嘛做测试&#xff1f;” 这是一则很有意思且大多数技术新人普遍存在的困惑&…

kubernetes-dashboard 安装配置

k8s 1.23以上的版本 https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 执行命令&#xff1a; kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 安装完成后&#x…

[问题记录] oracle问题汇总记录

plsql问题 1、oracle-initialization error could not locate OCI.dll 下载plsql客户端后&#xff0c;登录显示如图所示的错误 解决方法&#xff0c;点击下方链接&#xff0c;下载64位客户端 Instant Client for Microsoft Windows (x64) 64-bit (oracle.com) 2、显示中文乱…

百度语音识别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、建号—获取试用KEY二、测试代码三、运行四、运行结果五、验证五、总结 一、建号—获取试用KEY https://console.bce.baidu.com/ai/#/ai/speech/overview/index…

【Spring】SpringBoot整合MybatisPlus的基本应用

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、MybatisPlus简介 先来看一下官方的简介吧。 MyBatis-Plus &#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为 简化开发、提高效率而生。Myb…

Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如门控循环…

基于LSB(最低有效位)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

学习使用echats因xAxis值过多,可以滚动的柱状图解决方案

学习使用echats因xAxis值过多&#xff0c;可以滚动的柱状图解决方案 效果图柱状图代码关键代码 效果图 柱状图代码 function echarts() {// 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById(echart4));let xaxisData [1, 2,…

数据库 06-01 事务

01.定义 02.性质 03.简单事务模型 例子&#xff1a;

数据采集工具如何使用呢?那么设置数据采集的方法又是什么呢?

数据采集工具将能够非常有效地解决面临的各种问题。这款工具被设计成一种自动化数据采集工具&#xff0c;特别适用于对日志文件数据的采集。一旦完成设置&#xff0c;该工具将在后台实时进行数据采集&#xff0c;并自动对收集到的数据进行清洗&#xff0c;以确保最终保存到的数…

zIO: Accelerating IO-Intensive Applications with Transparent Zero-Copy IO——论文泛读

OSDI 2022 Paper 论文阅读笔记整理 问题 零拷贝IO一直是一个长期的性能目标。复制会引入内存和CPU开销&#xff0c;限制IO密集型应用程序的性能。IO数据复制在IO堆栈内、通过其应用程序编程接口&#xff08;API&#xff09;和应用程序内执行。现有工作的重点是开发零拷贝IO A…

紫光展锐P7885核心板详细参数介绍_5G安卓智能模块开发方案

紫光展锐P7885核心板采用了先进的6nm EUV制程工艺&#xff0c;集成了高性能的应用处理器和金融级安全解决方案&#xff0c;为用户带来了全新的性能体验。 P7885核心板搭载了先进的6nm制程工艺SoC P7885&#xff0c;其中包含四核A76和四核A55&#xff0c;主频可达2.7Ghz&#xf…

MySQL-linux安装-万能RPM法

一、MySQL的Linux版安装 1、 CentOS7下检查MySQL依赖 1. 检查/tmp临时目录权限&#xff08;必不可少&#xff09; 由于mysql安装过程中&#xff0c;会通过mysql用户在/tmp目录下新建tmp_db文件&#xff0c;所以请给/tmp较大的权限。执行 &#xff1a; chmod -R 777 /tmp2. …

spring boot3登录开发-3(2短信验证登录/注册逻辑实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 内容简介 功能分析 短信验证登录实现 1.创建交互对象 用户短信登录/注册DTO 创建用户登录VO…

Linux利用Jenkins部署SpringBoot项目保姆级教程

在当今快速发展的软件开发领域&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为提升开发效率、缩短产品上市时间的关键实践。Linux系统以其稳定性和开源友好性&#xff0c;成为众多开发者和企业的首选平台。而Spring Boot&#xff0c;作为一个轻量级的Jav…

【论文笔记】Text2QR

论文&#xff1a;Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…

STM32FATFS(未完待续)

注意&#xff0c;本博客适合像我一样的小白&#xff0c;会的不多&#xff0c;但是想快速做些东西&#xff0c;不适合会写驱动的大佬。另外&#xff0c;示例代码中的注释有误&#xff08;从多个项目中移植过来的&#xff0c;未做更改&#xff09;&#xff0c;请不要被误导&#…

ICLR 2024 | 鸡生蛋蛋生鸡?再论生成数据能否帮助模型训练

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 随着生成模型&#xff08;如 ChatGPT、扩散模型&#xff09;飞速发展&#x…

【详细讲解语言模型的原理、实战与评估】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…