【算法通关指南:算法基础篇】二分算法:1.在排序树组中查找元素的第一个和最后一个位置 2.牛可乐和魔法封印

【算法通关指南:算法基础篇】二分算法:1.在排序树组中查找元素的第一个和最后一个位置 2.牛可乐和魔法封印
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、二分算法

当我们的解具有二段性时,就可以使⽤二分算法找出答案:
• 根据待查找区间的中点位置,分析答案会出现在哪⼀侧;
• 接下来舍弃一半的待查找区间,转而在有答案的区间内继续使用二分算法查找结果。
时间复杂度为:O(logN)

STL中的二分查找lower_bound大于等于x的最小元素,返回的是迭代器;时间复杂度:O(log N) 。upper_bound大于x的最小元素,返回的是迭代器。时间复杂度:O(log N) 。

二、在排序树组中查找元素的第一个和最后一个位置

2.1题目

链接:在排序树组中查找元素的第一个和最后一个位置

在这里插入图片描述

2.2 算法原理

左右端点求法
(1)定义两个指针指向数组的头和尾
(2)二分区间
(3)判断获取的端点值是否合法

二分容易死循环的环节
(1)区间缩小头尾指针的相遇条件
(2)中值得求法

2.3代码

class Solution{ public: vector<int>searchRange(vector<int>& nums, int target){if(nums.size()==0)return{-1,-1};//二分查找左端点 int left =0,right = nums.size()-1;while(left < right){ int mid =(left + right)/2;if(nums[mid]>= target) right = mid;else left = mid +1;}if(nums[left]!= target)return{-1,-1}; int retleft = left;//二分查找右端点 left =0,right = nums.size()-1;while(left < right){ int mid =(left + right +1)/2;if(nums[mid]<= target) left = mid;else right = mid -1;}return{retleft,right};}};

三、牛可乐和魔法封印

3.1题目

链接:牛可乐和魔法封印

在这里插入图片描述

3.2 算法原理

二分查找算法模版题,依照第一题思路来写即可
注: 有可能并没有这个区间,需要在⼆分结束之后判断⼀下。

3.3代码

#include <iostream> using namespace std; const int N =1e5+10; typedef long long LL; LL a[N]; int n; int binary_search(int x,int y){ LL l =1,r = n;//查找左端点while(l < r){ LL mid =(l + r)/2;if(a[mid]>= x) r = mid;else l = mid +1;} LL retl = l;//判断端点是否合法if(a[l]< x)return0;//查找右端点 l =1,r = n;while(l < r){ LL mid =(l + r +1)/2;if(a[mid]<= y) l = mid;else r = mid -1;}if(a[r]> y)return0;return r - retl +1;} int main(){ cin >> n;for(int i =1;i <= n;i++) cin >> a[i]; int q; cin >> q;while(q--){ int x,y; cin >> x >> y; int ret =binary_search(x,y); cout << ret << endl;}return0;}

总结与每日励志

✨本次围绕二分算法展开,讲解其二段性核心逻辑及STL二分函数,结合两道实战题实操演练,重点掌握左右端点查找的二分模版、mid取整技巧及端点合法性判断,规避死循环误区。算法学习重在沉淀,每一道模版题的练习,都是突破瓶颈的底气。✨ 永远相信美好的事情即将发生,坚持刷题、深耕细节,不慌不忙,稳步前行,终会在算法之路上,遇见更好的自己!

在这里插入图片描述

Read more

【强化学习】近端策略优化算法(PPO)万字详解(附代码)

【强化学习】近端策略优化算法(PPO)万字详解(附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(9)---《近端策略优化算法(PPO)详解》 近端策略优化算法(PPO)详解 目录 PPO算法介绍 1. 背景 2. PPO 的核心思想 3. PPO 流程 4. 为什么 PPO 很强? 5. PPO 的直观类比 PPO算法的流程推导及数学公式 1. 背景与目标 2. PPO的概率比率 3. 优化目标 4. 值函数优化 5. 策略熵正则化

By Ne0inhk
《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 13 水果成篮 题目链接: 编辑 题目示例: 解法(滑动窗口): 算法思路: 算法流程: C++代码演示:方法一(使用容器) C++代码演示:方法二(用数组模拟哈希表) 算法总结及流程解析: 结束语 13 水果成篮 题目链接: 题目示例: 解法(滑动窗口): 算法思路:       研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。       让滑动窗口满足:窗口内水果的种类只有两种。       做法:右端水果进入窗口的时候,

By Ne0inhk
【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系

【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系

文章目录 * 一、树的概念与结构 * 1.树的概念 * 2.树的相关术语 * 3.树的表示 * 4.树形结构实际运用举例 * 二、二叉树的概念及特殊二叉树 * 1.二叉树的概念 * 2.特殊的二叉树 * 满二叉树 * 完全二叉树 * 二叉树的性质(由满二叉树特点推导) * 三、二叉树的存储结构 * 1.二叉树的顺序结构 * 2.二叉树的链式结构 * 四、堆和完全二叉树之间的关系以及堆的特性 * 1.堆和完全二叉树之间的关系 * 2.堆的特性 一、树的概念与结构 1.树的概念 树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合,把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的,

By Ne0inhk
【数据结构-初阶】二叉树(1)---树的相关概念

【数据结构-初阶】二叉树(1)---树的相关概念

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章中(这是文章链接:【数据结构-初阶】详解线性表(5)---队列),我们学习了初阶数据结构中的后一个线性表---队列,那么在初阶线性结构中线性表的内容我们就告一段落了,今天我们就进入到初阶段数据结构中的非线性表这块知识的学习.在这块知识中,我们会学习到树,但是还不学习图,这会等到我们学习C++语言的时候详细讲解 目录 一、树的相关概念 1.树的概念与结构: 2、树的相关术语 3、树的表示方法 4、树形结构在生活中的具体应用:   在学习二叉树之前,我们要先了解一下什么是树 一、树的相关概念 讲到树,我们就能联想到平时生活中所看到的植物树,那我们今天要讲的树与平时看到的树有联系吗?有的兄弟,当然有,我们今天要将的树灵感就是来源于生活中的树 生活中的树根是在地下的,分支是朝天上生长的,

By Ne0inhk