【基础算法】数组相关题目
系列综述:
💞目的:本系列是个人整理为了秋招算法
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于代码随想录
进行的,每个算法代码参考leetcode高赞回答和其他平台热门博客,其中也可能含有一些的个人思考。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
🌈数据结构基础知识总结篇
文章目录
- 二分查找
- 基本二分法
- 搜索插入位置
- 在排序数组中查找元素的第一个和最后一个位置
- 快慢指针
- 移除元素
- 有序数组的平方
- 滑动窗口
- 移除元素
- 参考博客
😊点此到文末惊喜↩︎
二分查找
基本二分法
- 二分法前提(有序无重复的数组)
- 数组
有序
:一次比较即可确定需要查找的那一半,效率高的关键 - 数组中
无重复元素
:一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一 - 查找对象为
数组
:数组可以进随机存取
- 数组
- 边界处理方式
- 左闭右闭 [left, right]:基本算法,可以定位后再寻找相同元素区域的左右边界
- 左闭右开 [left, right):可以在存在相同元素时,定位到相同元素区域的 左右边界
- leetcode题目:704. 二分查找
// *****************前闭后闭的基本二分查找,可以代替下一种******************* int search(vector<int>& nums, int target) { // 0. 健壮性检查if(nums.size() <= 0) return -1; // 1. 定义边界指针(指向遍历数组区域的边界位置)int left = 0;int right = nums.size() - 1; // 定义target在左闭右闭的区间里 // 2. 基本算法步骤的循环 while (left <= right) { // 前闭后闭用<=// - 定义int mid = left + ((right - left)>>2);// 防止溢出 等同于(left + right)/2// 目标值在左区间if (target < nums[mid]) {right = mid - 1; // 目标值在右区间} else if (target > nums[mid]) {left = mid + 1; // 找到目标值,即相等时} else {return mid; // 数组中找到目标值,直接返回下标}} // 3. 添加进行左右边界的定位操作// ...return -1;// 未找到目标值 }
- mid = L + ((R - L)>>1)
防溢出
:如果L 和 R太大,直接相加就有溢出的可能移位
:等价于除法算法,但是效率高
- 使用
前闭后闭
的二分区域查找,可以在查找target位置后再进行相同元素相连区域的定位操作。
- mid = L + ((R - L)>>1)
搜索插入位置
- 该题与二分查找类似,但是最后返回的是插入的位置,所以没找到时应该返回的是
最后比较的位置的后一个
- leetcode题目:35. 搜索插入位置
class Solution { public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while (left <= right){int mid = left + ((right-left) >> 2);if(target < nums[mid]){right = mid - 1;}else if(target > nums[mid]){left = mid + 1;}else{return mid;}}return left;// left为相等值未找到时应插入的位置} };
在排序数组中查找元素的第一个和最后一个位置
- 该题与二分查找类似,但是最后应该对于
相邻相同元素的起始和末尾
进行遍历判断 - leetcode题目:35. 搜索插入位置
vector<int> searchRange(vector<int>& nums, int target) {vector<int> res(2,-1);// 初始化两个值为-1的元素if(nums.size() <= 0) return res; // 基本二分法int left = 0;int right = nums.size()-1;int mid;while(left <= right){mid = left + ((right -left) >> 2);if(target < nums[mid]){right = mid - 1;}else if(target > nums[mid]){left = mid + 1;}else{break;// 保留mid}}// 寻找相似相邻区间的左右边界int l = mid;int r = mid;if(nums[mid] != target){return res;}else{while (l > 0){if(nums[l] == nums[l-1]){l--;}elsebreak;}while (r < nums.size()-1){if(nums[r] == nums[r+1]){r++;}elsebreak;}}cout << res[0]<< endl;res[0]=l;res[1]=r;return res;}
快慢指针
移除元素
- 快慢指针
- 快指针fast用于条件判断
- 慢指针slow用于位置保存
- leetcode题目:27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 你不需要考虑数组中超出新长度后面的元素。int removeElement(vector<int>& nums, int val) {// 快慢指针int slow = 0;int fast = slow;while(fast < nums.size()){if(nums[fast] == val){// 如果元素值为val,快指针选择下一个++fast;}else{// 如果找到非val元素,将该元素赋值给nums[slow]nums[slow] = nums[fast];++slow;++fast;}}return slow; }
有序数组的平方
- 循环不变量(循环中的变量的逻辑)
- 初始化: 迭代前,循环不变量为真
- 保持: 迭代中,前后状态的转移仍然能保证循环不变量为真
- 终止: 迭代后,循环不变量可以提供有用结果
- 逆向思维,充分利用不变的逻辑进行程序的简化。如下题中的
从后向前和从两边向中间
的遍历方式。 - leetcode题目:977. 有序数组的平方
vector<int> sortedSquares(vector<int>& nums) {// 用双指针指向两端,从两端向中间进行逼近int left = 0;int right = nums.size()-1;// 从后向前将每次比较较大的填入新的数组中vector<int> res(nums);int index = right;while (left <= right) {if (nums[left] * nums[left] > nums[right] * nums[right]) {res[index--] = nums[left] * nums[left];++left;} else {res[index--] = nums[right] * nums[right];--right;}}return res; }
滑动窗口
移除元素
-
滑动窗口:不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
-
滑动窗口基本框架
void slidwindow(vector<int> nums) {// 1. 窗口区间为[left, right)int left = 0;int right = 0;// 2. 直到到达窗口右边界while(right < nums.size()){// - 扩大右边界并更新窗口状态...right++;// - 窗口到达什么状态需要收缩while(需要收缩){// - 缩小左边界并更新窗口状态...left++;}} }
-
leetcode题目:209. 长度最小的子数组
int minSubArrayLen(int target, vector<int>& nums) {int left = 0;int right = 0; int res = INT_MAX;int len = 0;int windows_sum = 0;while(right < nums.size())//窗口区间为[left, right){windows_sum += nums[right];//更新窗口状态right++;while(windows_sum >= target)//收缩窗口{len = right - left;res = min(res, len);windows_sum -= nums[left];//更新窗口状态left++;}}return res == INT_MAX? 0:res; }
🚩点此跳转到首行↩︎
参考博客
- leetcode二分查找
- 代码随想录
- 二分查找算法详解
- 待定引用
- 待定引用
- 待定引用
- 待定引用
- 待定引用
相关文章:

【基础算法】数组相关题目
系列综述: 💞目的:本系列是个人整理为了秋招算法的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于代码随想录进行的,每个算法代码参考leetcode高赞回答和…...

MatBox—基于PyQt快速入门matplotlib的教程库
MatBox—基于PyQt快速入门matplotlib的教程库 __ __ _ _ _ _ _ _ _______ _ _ _ | \/ | | | | | | | | |(_)| | |__ __| | | (_) | || \ / | __ _ |…...
go channel使用
go语言中有一句名言: 不要通过共享内存来通信,而应该通过通信来共享内存。 channel实现了协程间的互相通信。 目录 一、channel声明 二、向channel发送数据 三、从channel读取数据 1. i, ok : <-c 2. for i : range c(常用)…...

5. QtDesignStudio中的3D场景
1. 说明: 三维渲染开发是Design Studio的重要功能,且操作方便,设计效率非常高,主要用到的控件是 View3D ,可以在3D窗口中用鼠标对模型直接进行旋转/移动/缩放等操作,也可以为模型设置各种动画,执行一系列的…...

人工智能的几个研究方向
人工智能主要研究内容是:分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别,视频识别,具体应用有人…...

软件测试 - 常见的开发模型和测试模型
1.瀑布模型优点强调开发的阶段性, 强调早期计划及需求调查, 强调产品测试;缺点1. 由于瀑布模型是一种线型结构的模型, 也就意味着前一个阶段结束, 后一个阶段才能开始, 这就导致了风险往往会迟至后期的测试阶段才显露, 因而失去了及早纠正的机会.2. 瀑布模型中测试被后置, 导致…...

从零开始的机械臂yolov5抓取gazebo仿真(四)
Moveit与Gazebo联合仿真 上一篇博客已经将moveit!配置完毕,然而想要让moveit!控制gazebo中的机械臂,还需要进行一些接口的配置。现在我们有的功能包为sunday_description、sunday_moveit_config这两个功能包。且已经配置好xacro文件,本篇内容…...

C++修炼之筑基期第一层——认识类与对象
文章目录🌷专栏导读🌷什么是面向对象?🌷类的引入🌷什么是类🌷类的定义方式🌷类的访问限定符与封装🌺访问限定符🌺封装🌷类的作用域🌷类的实例化&a…...

IT 运营监控工具
在技术复杂性日益增加、业务竞争激烈的挑战以及消费者对服务中断接受度降低的世界中,IT 运营效率已成为增长、利润和成功的关键。IT 宕机的影响在几十年前威胁较小,现在意味着价值数百万美元的损失,有时甚至会损失各种规模的组织的业务和声誉…...

java线程之Thread类的基本用法
Thread类的基本用法1. Thread类的构造方法2. Thread的几个常见属性常见属性线程中断等待一个线程小鱼在上一篇博客详细的讲解了如何创建线程,java使用Thread类来创建多线程,但是对于好多没有相关经验的人来说,比较不容易理解的地方在于操作系统调度的执行过程. 我们通过下面代码…...

【js】多分支语句练习(2)
个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页:python学不会123 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习…...

Redis与MySQL的双写一致性问题
Redis与MySQL的双写一致性问题更新缓存? 删除缓存?先更新缓存再更新数据库先更新数据库,再更新缓存先删除缓存再更新数据库先更新数据库,再删除缓存解决方案1. 重试2. 异步重试2.1 使用消息队列实现重试2.2 Binlog实现异步重试删除…...

Java基础:笔试题
文章目录Java 基础题目1. 如下代码输出什么?2. 当输入为2的时候返回值是多少?3. 如下代码输出值为多少?4. 给出一个排序好的数组:{1,2,2,3,4,5,6,7,8,9} 和一个数,求数组中连续元素的和等于所给数的子数组解析第一题第二题第三题第四题方案…...

spring三级缓存以及@Async产生循环引用
spring三级缓存以及Async产生循环引用spring三级缓存介绍三级缓存解除循环引用原理源码对应1、获取A,从三级缓存中获取,没有获取到2、构造A,将A置入三级缓存构造A(创建A实例)置入缓存3、注入属性,构造B扫描缓存实例的相关信息注入…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)
目录 写在前面: 题目:P2036 [COCI2008-2009#2] PERKET - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码…...

【Unity3D】Unity3D中在创建完项目后自动创建文件夹列表
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 随着项目开发的体量增大,要导入大量的素材、UI、模…...

如何设计一个锂电池充电电路(TP4056)
这个是个单节18650锂电池的充电模块,这个是个18650的锂电池,18指的是它的直径是18mm,65指的是它的高度为65mm。这个18650电池的标称电压是3.7V,电池充满时电压为4.2V,一般电池电压越高也就代表它所剩的电量越大。这种锂…...

Spark了解
目录 1 概述 2 发展 3 Spark和Hadoop 4 Spark核心模块 1 概述 Apache Spark是一个快速、通用、可扩展的分布式计算系统,最初由加州大学伯克利分校的AMPLab开发。 Spark可以处理大规模数据处理任务,包括批处理、迭代式算法、交互式查询和流处理等。Spa…...
c++STL急急急
文章目录cSTL急急急vector头文件扩容过程用法:size/emptyclear迭代器begin/endfront/backpush_back() 和 pop_back()queue头文件用法循环队列 queue用法优先队列 priority_queue用法stack头文件deque头文件deque中控器:用法set头文件用法迭代器begin/end…...

【C++学习】模板进阶——非类型模板参数 | 模板的特化 | 分离编译
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 模板我们之前一直都在使用,尤其是在模拟STL容器的时候,可以说,模板…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...