【基础算法练习】二分模板

news2024/12/22 14:28:44

文章目录

  • 二分模板题
  • 二分的思想
  • C++ 版本的二分
    • 整数二分模板
  • Golang 版本的二分
    • 整数二分模板
  • 例题:在排序数组中查找元素的第一个和最后一个位置
    • 题目描述
    • C++ 版本代码
    • Golang 版本代码

二分模板题

704. 二分查找,这道题目是最经典的二分查找,使用于任何模板(如果你学的模板连这道题都套不上,那大概是模板有问题)

34. 在排序数组中查找元素的第一个和最后一个位置,一个合格的二分模板,需要能够应对这道题目的两种二分情况,我待会儿也会以这道题作为例题

二分的思想

我学算法也有一年了,二分相关的题目刷了也有 20 道以上,二分的模板也学了不下于 3 套,每一套都很有道理,但做他们选的题目是做对了,当遇到野生的二分题目的时候,时常失灵

我自己也在努力总结二分的本质,之前我一直认为二分的本质就是寻找单调性,但似乎并不是这样的,有单调性的题目确实一定可以用二分,但有些没有单调性的题目也可以用二分

其实二分的本质并不是单调性,当我们能将数据分成两个区间,一个区间不符合要求可以舍去,一个区间包含我们需要的答案,需要保留,这样的题目就能够使用二分

C++ 版本的二分

整数二分模板

模板一:用于左半区间不存在答案,而右半区间存在答案的情况,也就是在 [ left,mid ],[ mid + 1,right ]

int l = 0, r = n - 1;
while (l < r) {
    int mid = l + r >> 1;
    if (check(mid)) r = mid;
    else l = mid + 1;
}

模板二:用于左半区间存在答案,而右半区间不存在答案的情况,也就是在 [ left,mid - 1 ],[ mid,right ]

 int l = 0, r = n - 1;
 while (l < r) {
     int mid = l + r + 1 >> 1;
     if (check(mid)) l = mid;
     else r = mid - 1;
 }

模板记忆方法:有 - 1,那求 mid 的时候就需要 + 1

Golang 版本的二分

整数二分模板

模板一:用于左半区间不存在答案,而右半区间存在答案的情况,也就是在 [ left,mid ],[ mid + 1,right ]

l, r := 0, len(nums)-1
for l < r {
    mid := l+(r-l)/2
    if check(mid) {
        r = mid
    } else {
        l = mid + 1
    }
}

模板二:用于左半区间存在答案,而右半区间不存在答案的情况,也就是在 [ left,mid - 1 ],[ mid,right ]

l, r = 0, len(nums)-1
for l < r {
    mid := l+(r-l+1)/2
    if check(mid) {
        l = mid 
    } else {
        r = mid - 1
    }
}

例题:在排序数组中查找元素的第一个和最后一个位置

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置

题目描述

C++ 版本代码

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.size() == 0) return {-1, -1};
        vector<int> ans;
        int l = 0, r = nums.size() - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        
        if (nums[l] != target) return {-1, -1};
        ans.push_back(l);

        l = 0, r = nums.size() - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (nums[mid] <= target) l = mid;
            else r = mid - 1;
        }
        ans.push_back(l);
        
        return ans;
    }
};

Golang 版本代码

func searchRange(nums []int, target int) (ans []int) {
    if len(nums) == 0 {
        return []int{-1, -1}
    }
    l, r := 0, len(nums)-1
    for l < r {
        mid := l+(r-l)/2
        if nums[mid] >= target {
            r = mid
        } else {
            l = mid + 1
        }
    }
    if nums[l] != target {
        return []int{-1, -1}
    }
    ans = append(ans, l)
    l, r = 0, len(nums)-1
    for l < r {
        mid := l+(r-l+1)/2
        if nums[mid] <= target {
            l = mid 
        } else {
            r = mid - 1
        }
    }
    ans = append(ans, l)
    return ans
}

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

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

相关文章

Git操作指南

Git操作指南 Git是一款非常强大的版本控制工具&#xff0c;可以帮助开发者管理代码的版本、协同开发以及进行代码的发布。以下是一些常见的Git操作指南。 基本操作 初始化一个Git仓库 git init添加文件到暂存区 git add 文件名提交更改到本地仓库 git commit -m "提…

Simulink|光伏并网逆变器低电压穿越仿真模型

目录 主要内容 模型研究 1.模型总览 2.boost模块 3.Inverter模块 4.控制模块 5.信号模块 结果一览 下载链接 主要内容 该模型为光伏逆变器低电压穿越仿真模型&#xff0c;采用boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。模型具备中点平衡…

CentOS安装Redis教程-shell脚本一键安装配置

文章目录 前言一、Redis单机版安装教程1. 复制脚本2. 增加执行权限3. 执行脚本 二、Redis扩展集群版安装教程1. 安装Redis单机版2. 复制脚本3. 增加执行权限4. 执行脚本5. 测试6. redis_cluster.sh 命令6.1 启动Redis扩展集群6.2 停止Redis扩展集群6.3 查看Redis扩展集群节点信…

在虚拟时空对话邓中亮院士,元宇宙访谈节目强势出圈

​​2023年12月&#xff0c;由米果集团、浙江省元宇宙产业基地联合出品的《科技领军人物的思维模式解析》访谈节目上线。在节目制作过程中&#xff0c;主持人对话“国际欧亚科学院院士、北京邮电大学邓中亮教授”&#xff0c;全程使用蓝海创意云的“vLive虚拟直播”系统进行节目…

Dubbo 3.x源码(16)—Dubbo服务发布导出源码(5)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(15)—Dubbo服务发布导出源码(4)&#xff0c;也就是Dubbo远程服务导出export方法的上半部分&#xff0c;也就是doLocalExport源码&#xff0c;将会得到一个Exporter。 现在我们…

LLM之RAG理论(七)| 高提升RAG检索的四种方法

​ RAG两大核心组件&#xff1a;检索和生成。本文将总结四种提高RAG系统检索质量的技术&#xff1a;1&#xff09;子问题查询引擎&#xff08;来自LlamaIndex&#xff09;&#xff0c;2&#xff09;RAG-Fusion、3&#xff09;RAG-end2end和4&#xff09;LoRA微调。 一、L…

司铭宇老师:门店经理培训:如何成为一位卓越的门店经理

门店经理培训&#xff1a;如何成为一位卓越的门店经理 在激烈的市场竞争中&#xff0c;门店经理作为门店的灵魂人物&#xff0c;肩负着提升门店业绩、维护品牌形象、带领团队成长等重要职责。本文将为您解析如何成为一位卓越的门店经理&#xff0c;助力您的职业生涯迈向新高峰…

5个程序员可以接私活的平台和一些建议

22年之前我从没有接触过程序员外包接单&#xff0c;也没有任何的私活接单经验&#xff0c;就纯纯看自己瞎摸索&#xff0c;通过Google搜索&#xff0c;在各类程序员私活接单平台上摸爬滚打&#xff0c;硬是杀出一条血路&#xff0c;从一开始的年入3k到现在每月稳定收入1w&#…

【排序算法】C语言实现归并排序,包括递归和迭代两个版本

文章目录 &#x1f680;前言&#x1f680;归并排序介绍及其思想&#x1f680;递归实现&#x1f680;迭代实现 &#x1f680;前言 大家好啊&#xff01;阿辉接着更新排序算法&#xff0c;今天要讲的是归并排序&#xff0c;这里阿辉将讲到归并排序的递归实现和迭代实现&#xff…

AI服务器行业分析:预计2023年全球市场规模将达211亿美元

AI服务器需求暴增&#xff0c;机构指出&#xff0c;AI时代浪潮汹涌&#xff0c;海量数据催生庞大的算力需求&#xff0c;带动AI服务器需求量与日俱增&#xff0c;用于服务器内、外部数据传输等接口芯片也随之攀升。 ChatGPT大火后&#xff0c;各大科技企业纷纷发力AI大模型&…

Vue的生命周期方法

beforeCreate 在实例初始化之后&#xff0c;数据观测&#xff08;data observe&#xff09;和 event/watcher 事件配置之前被调用。在当前阶段 data、methods、computed 以及 watch 上的数据和方法都不能被访问。 created 实例已经创建完成之后被调用。在这一步&#xff0c;实…

坚持刷题 |对称二叉树

文章目录 题目考察点代码实现实现总结扩展用迭代的方式判断是否为对称二叉树递归和迭代的对比可能的扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天真的好累&#xff0c;就不难为自己了&#xff0c;刷个简单级别的吧&#xff1a;对称二叉树 题目 101.对称二叉…

大数据开发之SparkSQL

第 1 章&#xff1a;spark sql概述 1.1 什么是spark sql 1、spark sql是spark用于结构化数据处理的spark模块 1&#xff09;半结构化数据&#xff08;日志数据&#xff09; 2&#xff09;结构化数据&#xff08;数据库数据&#xff09; 1.2 为什么要有sparksql hive on s…

如何开发一款独立游戏?

如何开发一款独立游戏&#xff1f; 2023年&#xff0c;Steam平台共发行了14533款游戏&#xff0c;我们可以清晰地看到独立游戏市场的蓬勃发展和不断增长的活力。我们从SteamDB数据统计网站获悉&#xff0c;2023年Steam平台的游戏发行数量比2022年的12562款增加了1971款&#xf…

理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。

最近我们技术群的一位小伙伴&#xff0c;分享了他面试理想汽车大模型算法工程师的经历与经验。 今天整理后分享给大家&#xff0c;如果你对这块感兴趣&#xff0c;可以文末加入我们的技术&面试讨论群 一面&#xff08;1.5h&#xff0c;感觉有点难&#xff09; 自我介绍&…

推荐收藏!48道数据分析师高频面试题汇总!

大家好&#xff0c;最近很多小伙伴私信我&#xff0c;讲一下数据分析的面试题&#xff0c;今天给大家整理了48道数据分析师面试时被频繁问到的题目&#xff0c;找数据分析岗位的同学一定要码住认真看。 想了解最新的面试动态、最新高频考点、技术交流的同学&#xff0c;可以文…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时&#xff0c;出现如下情况&#xff0c;显示无法访问。 解决方案&#xff1a; 打开域名查询网站&#xff1a;https://tool.chinaz.com/dns 输入GitHub的域名&#xff0c;点击立即检测。 出现如下页面&#xff0c…

RK3399平台开发系列讲解(USB篇)BusHound 工具使用介绍

🚀返回专栏总目录 文章目录 一、BusHound简介二、BusHound的下载三、BusHound设备窗口四、BUSHound发送命令窗口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 BusHound软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名…

2024年学鸿蒙开发有前途吗?

随着科技的不断发展和智能设备的普及&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐渐受到市场的关注。2024年&#xff0c;学鸿蒙开发是否有前途&#xff0c;成为了很多开发者和学生关心的问题。本文将从多个角度分析鸿蒙系统的发展前景&#xff0c;以及学习…

JavaScript入门分享

文章目录 一、JavaScript简介二、第一个JavaScript案例三、在浏览器中执行JavaScript代码四、JavaScript的输出方法五、JavaScript的语法六、JavaScript的数据类型七、JavaScript的定义变量/函数八、热门文章 一、JavaScript简介 JavaScript是一种高级编程语言&#xff0c;用于…