代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
Leetcode 704 二分查找
题目链接:704二分查找
介绍
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。


思路
先看看一个动画,可以看出二分查找只用了3次即可查找成功,而顺序查找却要用12次。

二分查找算法的原理如下:
1. 设置查找区间:low = 0;high= n;
2. 若查找区间[low, high]不存在,则查找失败;否则转步骤3
3. 取中间位mid = (low + high) / 2;比较 target 与 arr[mid],有以下三种情况:
3.1 若 target < arr[mid],则high = mid - 1;查找在左半区间进行,转步骤2;
3.2 若 target > arr[mid],则low = mid + 1;查找在右半区间进行,转步骤2;
3.3 若 target = arr[mid],则查找成功,返回 mid 值;
二分法易错点:边界问题—一般情况下,写二分法时,要么是左闭右闭,要么是左闭右开,区间不一样时,会影响边界条件的处理。
while(left<right) 还是while(left<=right)
if(target<nums[middle]) right = mid 还是right = mid -1
左闭右闭:
left = 0
right = num.size-1
while(left<=right){ //[1,1]时left=right是合法区间middle = (left+right)/2if(target < nums[middle]) right = middle - 1;else if(target > nums[middle]) left = middle + 1;else return middle;
}
return -1
}左闭右开:
left = 0
right = num.size
while(left<right){ //[1,1)开不包含右边界,闭包含左边界,这里又包含又不包含说明不是一个合 法的区间middle = (left+right)/2if(target < nums[middle]) right = middle;else if(target > nums[middle]) left = middle + 1;else return middle;
}
return -1
}代码
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while(left <= right){int middle = (left + right)/2;//int middle = left + ((right-left)/2);if(target < nums[middle]){right = middle - 1;}else if(target > nums[middle]){left = middle + 1;}else{return middle;}}return -1;}
};Leetcode 27 移除元素
题目链接:27 移除元素
介绍
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。即在数组中如果要删除x,那么就得让x后面的元素一个个覆盖到前一个上去。c++中的vector,或java/python会提供数组的接口,删除元素后,返回的数组size会-1,但并不代表实际空间-1。例如:vector.erase()可以删除数组中的某一个元素,实际上这个函数也是进行了一个覆盖的操作,时间复杂度为O(n)。
思路一:暴力实现

两层for循环,第一层for循环遍历数组,找到要删除的元素;第二层for循环将要删除元素后面的元素覆盖到前面来。
思路二:双指针思路O(n)
使用一层for循环做了两层for循环所做的事。
定义一个快指针fastIndex,获取新数组中的元素
定义一个慢指针slowIndex,指向更新新数组下标的位置
开始的时候fastIndex移动,直到找到所要删除的元素后,给慢指针slowIndex赋值。将fastIndex++(指向后一个元素方便覆盖),然后将nums[fastIndex]的值赋给nums[slowIndex],再将fastIndex++,slowIndex++。

slow = 0;
for(fast=0;fast<nums.size;fast++){if(nums[fast]!=val){nums[slow] = nums[fast];//把快指针指向的值赋给慢指针所在的位置slow++ //慢指针++}//如果nums[fast]==val,就只需要让fast++就行,也就是继续进行for循环中的fast++操作//最后slow所指向的下标的位置,就是新数组的大小
}
return slow;代码
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;int fastIndex;for(fastIndex=0;fastIndex<nums.size();fastIndex++){if(nums[fastIndex]!=val){nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
};
相关文章:
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
Leetcode 704 二分查找题目链接:704二分查找介绍给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。思路先看看一个…...
office@word@ppt启用mathtype组件方法整理
文章目录将mathtype添加到word中ref查看office安装路径文件操作法Note附PPT中使用mathtype将mathtype添加到word中 先安装office,再安装mathtype,那么这个过程是自动的如果是先安装mathtype,再安装office,那么有以下选择: 重新安装一遍mathtype(比较简单,不需要说明)执行文件操…...
计算机大小端
我们先假定内存结构为上下型的,上代表内存高地址,下代表内存低地址。 电脑读取内存数据时,是从低位地址到高位地址进行读取(从下到上)。 1、何为大小端 大端:数据的高位字节存放在低地址,数据…...
Matplotlib绘图从零入门到实践(含各类用法详解)
一、引入 Matplotlib 是一个Python的综合库,用于在 Python 中创建静态、动画和交互式可视化。 本教程包含笔者在使用Matplotlib库过程中遇到的各类完整实例与用法还有遇到的库理论问题,可以根据自己的需要在目录中查询对应的用法、实例以及第四部分关于…...
C语言 入门教程||C语言 指针||C语言 字符串
C语言 指针 学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。 …...
Nacos2.x+Nginx集群配置
一、配置 nacos 集群 注意:需要先配置好 nacos 连接本地数据库 1、拷贝三份 nacos 2、修改配置文件(cluster.conf) 修改启动端口: nacos1:8818 nacos2:8828 nacos3:8838 当nacos客户端升级为…...
Android源码分析 - InputManagerService与触摸事件
0. 前言 有人问到:“通过TouchEvent,你可以获得到当前的触点,它更新的频率和屏幕刷新的频率一样吗?”。听到这个问题的时候我感到很诧异,我们知道Android是事件驱动机制的设计,可以从多种服务中通过IPC通信…...
python库--urllib
目录 一.urllib导入 二.urllib爬取网页 三.Headers属性 1.使用build_opener()修改报头 2.使用add_header()添加报头 四.超时设置 五.get和post请求 1.get请求 2.post请求 urllib库和request库作用差不多,但比较起来request库更加容易上手,但该了…...
美团前端二面常考react面试题及答案
什么原因会促使你脱离 create-react-app 的依赖 当你想去配置 webpack 或 babel presets。 React 16中新生命周期有哪些 关于 React16 开始应用的新生命周期: 可以看出,React16 自上而下地对生命周期做了另一种维度的解读: Render 阶段&a…...
环境搭建04-Ubuntu16.04更改conda,pip的镜像源
我常用的pipy国内镜像源: https://pypi.tuna.tsinghua.edu.cn/simple # 清华 http://mirrors.aliyun.com/pypi/simple/ # 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ #中国科技大学1、将conda的镜像源修改为国内的镜像源 先查看conda安装的信息…...
【C++进阶】四、STL---set和map的介绍和使用
目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set的介绍及使用 4.1 set的介绍 4.2 set的使用 五、multiset的介绍及使用 六、map的介绍和使用 6.1 map的介绍 6.2 map的使用 七、multimap的介绍和使用 一、关联式容器 前面已经接触过 STL 中的部分…...
JavaSE学习进阶 day1_01 static关键字和静态代码块的使用
好的现在我们进入进阶部分的学习,看一张版图: 前面我们已经学习完基础班的内容了,现在我们已经来到了第二板块——基础进阶,这部分内容就不是那么容易了。学完第二板块,慢慢就在向java程序员靠拢了。 面向对象进阶部分…...
苹果笔可以不买原装吗?开学必备性价比电容笔
在当今的时代,电容笔日益普及,而且相关的功能也逐渐完善。因此,在使用过程中,怎样挑选一款性价比比较高的电容笔成为大家关心的焦点。随着电容笔的普及,更好更便宜的电容笔成为了一种趋势。那么,哪个品牌的…...
数据库连接与properties文件
管理properties数据库: 现在pom文件中加入Druid的坐标: <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>配置文件中添加相应的数据&…...
Linux上的校验和验证
校验和(checksum)程序用来从文件中生成相对较小的唯一密钥。我们可以重新计算该密钥,用以检查文件是否发生改变。修改文件可能是有意为之(添加新用户会改变密码文件),也可能是无意而为(从CD-ROM…...
杂记——14.git在idea上的使用及其实际开发介绍
这篇文章我们来讲一下git在idea上的使用,以及在实际开发过程中各个分支的使用及其具体的流程 目录 1.git在idea上的使用 1.1 idea上的git提交 1.2 idea上的分支切换 2.git在实际运用时的分支及其流程 2.1分支介绍 2.2具体流程 3.小结 1.git在idea上的使用 …...
记一次Nodejs减低npm版本的踩坑日记
使用了npm install -g npm6.4.1指令之后,把npm版本减低了,让后悲催的就来了。 由于npm 6.4.1 已经过时,导致运行npm时出现 npm does not support Node.js v18.14.2 版本不兼容问题 升级npm版本,npm install -g npmlatest 没用还是…...
【iOS】—— 初识RAC响应式编程
RAC(ReactiveCocoa) 文章目录RAC(ReactiveCocoa)响应式编程和函数式编程的区别函数式编程响应式编程响应式编程的优点RAC操作1.利用button点击实现点击事件和传值2.RACSignal用法RACSignal总结:3.对于label的TapGestur…...
Java——面向对象
目录 前言 一、什么是面向对象? 面向过程 & 面向对象 面向对象 二、回顾方法的定义和调用 方法的定义 方法的调用 三、类与对象的创建 类和对象的关系 创建与初始化对象 四、构造器详解 五、创建对象内存分析 六、封装详解 七、什么是继承&#x…...
电影《毒舌律师》观后感
上周看了《毒蛇律师》这部电影,讲述一位’大律师’在法庭为己方辩护,最终赢得辩护的故事。 (1)人之常情 说起法律相关,不禁会让人联想到讲法律相关知识的罗翔老师,平时也会看他相关视频,无论是亲…...
开源AI助手竟能自主建频道、做视频?李宏毅深度解析“小龙虾”的神秘工作原理!
最近全网爆火的「养龙虾」到底是什么?为什么一个开源的 AI 助理项目,能让 AI 自己创建 YouTube 频道、自己做教学视频、24 小时自主干活? 台大李宏毅老师的这堂《解剖小龙虾 — 以 OpenClaw 为例介绍 AI Agent 的运作原理》,用最通…...
从SuperGlue到LoFTR:无检测器特征匹配是如何“卷”出来的?技术演进深度解读
从SuperGlue到LoFTR:无检测器特征匹配的技术革命与范式迁移 在计算机视觉领域,特征匹配一直是三维重建、SLAM、图像配准等任务的核心基础。传统方法如SIFT、ORB等基于手工设计的特征检测与描述算法,在过去二十年里主导了这一领域。然而&#…...
深度解析Internet Archive下载器:数字图书馆资源获取的完整方案
深度解析Internet Archive下载器:数字图书馆资源获取的完整方案 【免费下载链接】internet_archive_downloader A chrome/firefox extension that download books from Internet Archive(archive.org) and HathiTrust Digital Library (hathitrust.org) 项目地址:…...
DXVK性能优化:让老旧系统重获新生的完美方案
DXVK性能优化:让老旧系统重获新生的完美方案 【免费下载链接】dxvk Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 为什么老旧电脑运行新程序总是卡顿?DXVK如何解决…...
Python异步编程避坑:为什么你的‘async with’会报错?手把手教你正确使用aiohttp
Python异步编程避坑指南:深入理解aiohttp的正确打开方式 第一次接触Python异步编程时,很多人都会在async with这个语法上栽跟头。明明照着文档写的代码,运行时却抛出"SyntaxError: async with outside async function"的错误&#…...
5分钟搞定三网话费余额查询:手把手教你用PHP+HTML搭建查询系统(含API调用避坑指南)
三网话费查询系统开发实战:从API调用到前端优化的全流程指南 最近在帮朋友开发一个小型话费查询工具时,发现市面上关于三网运营商API调用的完整教程并不多见。大多数开发者遇到问题时只能靠反复试错,特别是当需要同时对接移动、联通、电信三家…...
MRM-MOT4X3.6CAN电机驱动库:工业级CAN总线电机控制抽象层
1. 项目概述mrm-mot4x3.6can是一款面向工业级电机控制场景的专用 CAN 总线驱动库,专为 MRMS(Modular Robotic Motor Systems)公司推出的MRM-MOT4X3.6CAN 四通道直流电机控制器设计。该控制器集成 4 路独立 H 桥驱动单元,每路持续输…...
LWIP内存管理踩坑实录:从pbuf泄漏到pcb耗尽,我的嵌入式网络调试日记
LWIP内存管理踩坑实录:从pbuf泄漏到pcb耗尽,我的嵌入式网络调试日记 凌晨三点,调试器上的红色LED还在闪烁。这是我连续第三个通宵追踪LWIP的内存问题——设备在运行48小时后必然崩溃,日志里满是"pbuf_alloc failed"和&q…...
【手把手】FFmpeg音视频开发从入门到实战:一文吃透音视频同步原理与代码实现(附完整源码)
文章目录第一章 基础必懂:音视频开发的核心概念与FFmpeg框架1.1 别再被封装格式忽悠:MP4、MKV、AVI到底差在哪?1.2 搞懂解码流程:FFmpeg处理音视频的4个核心结构体第二章 深入原理:音视频同步的核心机制2.1 播放器卡顿…...
Qt串口通信实战:用QSerialPort从零搭建一个串口调试助手(附完整源码)
Qt串口通信实战:从零构建工业级调试助手 在嵌入式开发和工业控制领域,串口通信作为最基础也最可靠的通信方式之一,至今仍发挥着不可替代的作用。无论是单片机与上位机的数据交换,还是工业设备的参数配置,一个稳定高效的…...
