C++算法第九天

本篇文章我们继续学习c++算法

目录

第一题

题目链接

题目展示

代码原理

暴力解法

二分解法

代码编写

第二题

题目链接

题目展示

代码原理

代码编写

重点回顾

朴素二分

非朴素二分

重点一

重点二

重点三


第一题

题目链接

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

题目展示

代码原理

图1

从图1中我们将4567分为一组,012分为另一组,并且以2为参照点,从而有了图1中类似数学中的分段函数的图,从这个图中我们可以看到有明显的二段性,因此,我们就可以使用二分查找进行解题。那么在讲解二分算法之前,我们先来讲解一下这个暴力解法

暴力解法

依次遍历,最后取得最小值并返回即可

二分解法

代码编写

class Solution {

public:

int findMin(vector<int>& nums) {

int left = 0, right = nums.size() - 1;

int x = numsright;

while(left < right)

{

int mid = left + (right - left) / 2;

if(numsmid > x)

left = mid + 1;

else

right = mid;

}

return numsright;

}

};

第二题

题目链接

LCR 173. 点名 - 力扣(LeetCode)

题目展示

代码原理

代码编写

class Solution {

public:

int findMin(vector<int>& nums) {

int left = 0, right = nums.size() - 1;

int x = numsright;

while(left < right)

{

int mid = left + (right - left) / 2;

if(numsmid > x)

left = mid + 1;

else

right = mid;

}

return numsright;

}

};

总结

其实从这道题中,我们可以发现这题的二段性并不是和之前一样是大小关系了,而是等于下标和不等于下标的关系了,因此我们在学习的时候不能把一个知识点学死了,随机应变才是上策

那么二分查找的到这里就已经结束了,我们最后再来回顾一下二分查找的重点

重点回顾

朴素二分

先根据最初的left和right指针计算出mid指针,再将mid与目标值进行比较,然后缩小空间,继续查找

非朴素二分

重点一

循环条件必须是left < right,至于为什么只能是它,前面的文章已经讲解原因如果已经忘记的小伙伴可以返回前面的文章仔细阅读,如果是新来的小伙伴,那么先当作一个结论记下来,把题目大概理解后再回去看原因

重点二

求重点的操作,注意了这个必须得记住

重点三

当推理出左端点的条件后,右端点的条件取反即可

重点四

二分算法的使用前提是有二段性

那么本篇文章的内容就先到这里了,我们下期文章再见!!!

记得一键三联哦!!!

相关推荐
code_pgf14 小时前
C++11 / C++14 / C++17 / C++20 新特性总结
c++·c++20
魔力女仆15 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_8949155316 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋16 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
颜x小18 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_4236521318 小时前
C#使用JObject
开发语言·c#
国科安芯18 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
汉克老师19 小时前
GESP2026年3月认证C++八级( 第三部分编程题(2、子图最短路)精讲
c++·最短路·floyd·gesp8级
霸道流氓气质20 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen17820 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构