算法刷题Day1 | 704.二分查找、27.移除元素
目录
- 0 引言
- 1 二分查找
- 1.1 我的解题
- 1.2 修改后
- 1.3 总结
- 2 移除元素
- 2.1 暴力求解
- 2.2 双指针法(快慢指针)

- 🙋♂️ 作者:海码007
- 📜 专栏:算法专栏
- 💥 标题:代码随想录算法训练营第一天 | 704.二分查找、27.移除元素
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
0 引言
1 二分查找
- 🎈 文档讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
- 🎈 视频讲解:https://www.bilibili.com/video/BV1fA4y1o715/
- 🎈 做题状态:有思路但是不清晰,对于循环的判断条件还有区间的变换存在疑惑(这些就是二分法的易错点)
1.1 我的解题

class Solution {
public:int search(vector<int>& nums, int target) {int left, right, middle;left = 0;right = nums.size() - 1;if (right == left){if (target == nums[left]){return left;}else{return -1;}}while (right != left + 1){middle = (right - left) / 2 + left;cout << "middle = " << middle << endl;if (target == nums[middle]){return middle;}else if (target > nums[middle]){left = middle;}else{right = middle;}}if (target == nums[left]){return left;}else if (target == nums[right]){return right;}else{return -1;}}
};
分析:没有标准答案简洁,原因是我的 left 和 right 赋值思路不对(相差1)。我是判断完大小后直接将 left 和 right 直接赋值 middle 。其实这样不对,因为 middle 的值已经判断过了,不需要再将这个索引值包含在 [left, right]区间中。
1.2 修改后
所以需要将代码进行如下修改,这样可以省去很多其他条件的判断。
class Solution {
public:int search(vector<int>& nums, int target) {int left, right, middle;left = 0;right = nums.size() - 1;while (right >= left){middle = (right - left) / 2 + left;cout << "middle = " << middle << endl;if (target == nums[middle]){return middle;}else if (target > nums[middle]){left = middle + 1;}else{right = middle - 1;}}return -1;}
};
1.3 总结
看到顺序排列的数组,就可以联想到二分法
二分法易错点:
- while循环条件:
- while(left <= right)
- while(left < right)
- left和right的赋值
- left = middle+1; right = middle -1;
- left = middle+1; right = middle;
其实while和left、right的赋值是对应的,
- 使用while(left <= right)循环时,left = middle+1; right = middle -1;
- 使用while(left < right)循环时,left = middle+1; right = middle;
因为当 left = middle+1; right = middle -1; left和right都把已经判断过的 middle 索引给排除在区间之外了,所以循环遍历的条件需要包括 left和right ,也就是 左闭右闭 区间。
当 left = middle+1; right = middle; 可以发现right没有把已经判断过的 middle 索引给排除在区间之外,所以循环条件不需要包括 right 的索引, 也就是 左闭右开 区间。
使用左闭右闭 区间时,最后left和right的结果是什么,当 left等于right的时候(此时middle也等于left和right),还会再执行一次循环,当nums[middle] > target 时 right = middle+1; 也就是说right又往右移动了一位。当nums[middle] <= target 时,right保持原位置不变。
这个特性可以帮助 35.搜索插入位置 这道题理解。
2 移除元素
- 🎈 文档讲解:https://www.programmercarl.com/
- 🎈 视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP/?vd_source=d499e7f3a8e68e2b173b1c6f068b2147
- 🎈 做题状态:暴力求解没太大难度,快慢指针有需要理解的地方
2.1 暴力求解
一开始用暴力求解,输出答案不对,代码如下。我的的输出结果总是不能把最后一位元素给移除,后面发现遍历时没有遍历到最后一个元素。i < arraySize - 1 判断条件没写好,应该是 i < arraySize 或者 i <= arraySize - 1 。这个易错点以后要注意!!!


class Solution {
public:int removeElement(vector<int>& nums, int val) {int arraySize = nums.size();for (int i = 0; i <= arraySize - 1; i++){cout << "i = " << i << endl;if (nums[i] == val){for (int j = i; j < arraySize - 1; j++){nums[j] = nums[j + 1];}--arraySize;--i;}}return arraySize;}
};
2.2 双指针法(快慢指针)
快指针:遍历元素值
慢指针:存储新数组的元素值
思路:
遇到等于目标元素的值就跳过,遇到不等于目标元素的值就进行赋值。借助两个索引值(fastIndex和slowIndex)实现,fastIndex遇到目标元素就跳过,此时slowIndex不动,因为目标元素不需要存储。然后遇到不等于目标元素的值就进行赋值。此时是fastIndex在前面探路,然后slowIndex将fastIndex探路得到的结果进行保存。
因为数组的存放是顺序的,所以只有在遇到不等于目标元素的值时,slowIndex才会增加一,然后将非目标值保存下来。
fastIndex从头遍历到尾,所以直接用fastIndex作为遍历元素,条件为 fastIndex < nums.size() 即可。然后当 fastIndex 所指元素不等于目标元素值时,此时将 fastIndex 的值赋值给slowIndex 处。并且slowIndex加一。由此可知 nums 数组中有多少个不等于目标值的元素(个数就是slowIndex)。
class Solution {
public:int removeElement(vector<int>& nums, int val) {int fastIndex;int slowIndex = 0;for ( fastIndex = 0; fastIndex < nums.size(); fastIndex++){if (nums[fastIndex] != val){nums[slowIndex] = nums[fastIndex];++slowIndex;}}return slowIndex;}
};
相关文章:
算法刷题Day1 | 704.二分查找、27.移除元素
目录 0 引言1 二分查找1.1 我的解题1.2 修改后1.3 总结 2 移除元素2.1 暴力求解2.2 双指针法(快慢指针) 🙋♂️ 作者:海码007📜 专栏:算法专栏💥 标题:代码随想录算法训练营第一天…...
大数据技术学习笔记(五)—— MapReduce(2)
目录 1 MapReduce 的数据流1.1 数据流走向1.2 InputFormat 数据输入1.2.1 FileInputFormat 切片源码、机制1.2.2 TextInputFormat 读数据源码、机制1.2.3 CombineTextInputFormat 切片机制 1.3 OutputFormat 数据输出1.3.1 OutputFormat 实现类1.3.2 自定义 OutputFormat 2 Map…...
北斗导航 | 同步双星故障的BDS/GPS接收机自主完好性监测算法
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 同步双星故障的BDS/GPS接收机自主完好性监测算法 1 引言2 同步双星故障…...
2024金三银四必看前端面试题!简答版精品!
文章目录 导文面试题 导文 2024金三银四必看前端面试题!2w字精品!简答版 金三银四黄金期来了 想要跳槽的小伙伴快来看啊 面试题 基于您给出的方向,我将为您生成20个面试题和答案。请注意,由于面试题的答案可能因个人经验和理解而…...
Python-sklearn.datasets-make_blobs
sklearn.datasets.make_blobs()函数形参详解 """ Title: datasets for regression Time: 2024/3/5 Author: Michael Jie """from sklearn import datasets import matplotlib.pyplot as plt# 产生服从正态分布的聚类数据 x, y, cen…...
[最佳实践] conda环境内安装cuda 和 Mamba的安装
Mamba安装失败的过程中,causal-conv1d安装报错为连接超时 key word: vision mamba, DL ,深度学习 ,mamba unet,mamba环境安装 Mamba安装 主要故障是 pip install causal-conv1d1.2.0和 pip install mamba-ssm1.2.0 安…...
【算法】顺时针打印矩阵(图文详解,代码详细注释
目录 题目 代码如下: 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则打印出数字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 这一道题乍一看,没有包含任何复杂的数据结构和…...
蚂蚁感冒c++
题目 思路 “两蚂蚁碰面会掉头,若其中一只蚂蚁感冒了,会把感冒传染给碰到的蚂蚁”,这句话看作是“两蚂蚁碰面会互相穿过,只是把感冒的状态传给了另一只蚂蚁”,因为哪只蚂蚁感冒了并不是题目的重点,重点是有…...
python Plotly可视化
文章目录 Plotly常用函数PolarPlotlymake_subplotsadd_tracego.Scatterpolarglupdate_tracesupdate_layout综合示例 完整版 Python在数据可视化方面有着丰富的库和函数,其中一些常用的库包括 Matplotlib、Seaborn、Plotly、Bokeh等。 Plotly是一个交互式绘图库&…...
刷题第10天
代码随想录刷题第10天 |● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 239. 滑动窗口最大值 唉,好难,先记个思路吧 class Solution { private:class MyQueue { //单调队列(从大到小)public:deque<int> que; // 使用deq…...
Bililive-go 实现直播自动监控录制
前言 最近有直播录制的需求,但是自己手动录制太麻烦繁琐,于是用了开源项目Bililive-go进行全自动监控录制,目前这个项目已经有3K stars了 部署 为了方便我使用了docker compose 部署 version: 3.8 services:bililive:image: chigusa/bilil…...
【Redis】Redis持久化模式RDB
目录 引子 RDB RDB的优缺点 小节一下 引子 不论把Redis作为数据库还是缓存来使用,他肯定有数据需要持久化,这里我们就来聊聊两种持久化机制。这两种机制,其实是 快照 与 日志 的形式。快照:就是当前数据的备份,我可以拷贝到磁…...
Java基础 - 模拟医院挂号系统
模拟医院挂号系统功能 1. 科室管理:新增科室,删除科室(如果有医生在,则不能删除该科室),修改科室 2. 医生管理:录入医生信息以及科室信息,修改医生信息(主要是修改个人…...
【论文精读】基于知识图谱关系路径的多跳智能问答模型研究
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...
uni app 微信小程序微信支付
使用方法 接口传参 使用wx.requestPayment方法是一个统一各平台的客户端支付API,不管是在某家小程序还是在App中,客户端均使用本API调用支付...
Dgraph 入门教程一《 概览》
1、Dgraph的特点 (1) 分布式规模:可以发布和处理大量数据 (2)支持GraphQL:一种内置的查询语法,类似SQL。可以让数据操作起来更简单 (3)完全的事务处理和ACID兼容:满足OLTP工作负载,该负载要求频繁的插入和更新数据。 (4)支持多…...
VSCode安装
前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器,支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…...
STM32各外设初始化步骤
1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…...
10. Nginx进阶-Return
简介 什么是Return? nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作,如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…...
Nircmd集成定时执行专家之后的使用场景
Nircmd工具拥有了定时执行功能之后,可以用于以下场景: 1. 自动化日常工作 定时清理系统垃圾文件定时备份重要文件定时关闭或重启电脑定时发送邮件或短信定时执行其他程序或脚本 2. 监控系统状态 定时检查系统温度定时检查磁盘空间定时检查网络连接定时…...
5.20 明天见!拿好这份参会指南|AIGC2026峰会
组委会 发自 凹非寺量子位|公众号 QbitAI明天5月20日,09:30,中国AIGC产业峰会准时开场。提前查好路况,定好闹钟,我们现场见。所有人,马上AI起来。明天聊什么?议程帮你划重点上午场:A…...
CentOS 7服务器部署:NFS共享、Nginx-RTMP流媒体与Qt无GUI环境全攻略
1. 项目概述与核心思路最近在华为云的一台CentOS 7.4 64位服务器版ECS上,完整部署了一套用于音视频处理和后台服务的开发环境。这个环境的核心目标,是为一个需要处理视频流、提供Web服务,并能方便地进行跨机文件共享和Qt程序编译的后台系统打…...
基于AVR单片机的无线图像侦检系统:从硬件选型到软件实现
1. 项目概述与核心价值最近在整理过去的项目资料,翻到了一个挺有意思的老项目——基于Atmel AVR单片机的无线图像侦检系统。虽然现在STM32、ESP32满天飞,各种高性能MCU和无线模块层出不穷,但这个项目在当年(以及现在某些特定场景下…...
2024年Java开发者必看:这些过时技术可战略性放弃
1. 项目概述:重新审视Java学习的“必选项”最近在技术社区看到一个挺有意思的讨论,标题是“可以不必再学习的Java知识?”。这话题一出,立刻引起了我们这些老Java开发者的共鸣。从业十几年,从Java 5一路跟到现在的Java …...
从PME消息到唤醒中断:图解Linux内核处理PCIe设备唤醒的完整链条与潜在陷阱
从PME消息到唤醒中断:图解Linux内核处理PCIe设备唤醒的完整链条与潜在陷阱 当一块NVMe SSD在深夜的服务器机柜中突然闪烁起状态灯,或是数据中心网卡因流量激增从节能模式苏醒时,PCIe总线上正上演着一场精密的电子芭蕾。这场唤醒仪式的核心角色…...
如何快速掌握AI音频处理:免费开源语音转换与分离终极指南
如何快速掌握AI音频处理:免费开源语音转换与分离终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conv…...
3大策略掌握Avidemux视频编辑:从源码编译到专业级处理
3大策略掌握Avidemux视频编辑:从源码编译到专业级处理 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款开源跨平台视频编辑工具,专注于快速剪辑、编码转换和批…...
5步实现Windows直接安装Android应用:APK Installer完全指南
5步实现Windows直接安装Android应用:APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过,在Windows电脑上安装…...
3分钟掌握OBS智能跟拍:告别手动调焦的直播神器
3分钟掌握OBS智能跟拍:告别手动调焦的直播神器 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker 您是否曾因直播时频繁调整镜头位置而分心?是否希望有一个…...
手把手教你用Wireshark和VirtualBox日志诊断eNSP错误代码40(保姆级排错流程)
从日志分析到网络诊断:eNSP错误代码40的深度排错指南 当eNSP模拟器弹出"错误代码40"的红色警告时,大多数用户的第一反应是寻找快速解决方案。但真正的网络工程师会告诉你,这个数字背后隐藏着虚拟网络世界的完整故事。本文将带您穿…...
