代码随想录算法训练营day1 | 704. 二分查找、27. 移除元素

数组理论基础

数组是存放在连续内存空间上的相同类型数据的集合。

因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,需要移动其他元素的地址。

那么二维数组在内存的空间地址是连续的么?不同编程语言的内存管理是不一样的,以C++为例,在C++中二维数组是连续分布的。

704. 二分查找

看题解之前

二分查找,前提是有序数组。数组元素重复的话返回值不唯一

区间的定义不要改变,根据区间定义确定边界条件

使用左闭右闭
  1. while left <= right 左闭右闭的情况下,left==right是有效的
  2. if target < nums[mid]: right = mid - 1 此时mid已经不满足条件,在左闭右闭的情况下,需要移动到有效区间上
  3. if target > nums[mid]: left = mid + 1
  4. 初始化 right = len(nums) - 1
class Solution:def search(self, nums: List[int], target: int) -> int:# 左闭右闭区间left = 0right = len(nums) - 1while left <= right:mid = left + (right - left) // 2if target < nums[mid]:right = mid - 1elif target > nums[mid]:left = mid + 1else:return midreturn -1
使用左闭右开
  1. while left < right 左闭右开的情况下,left==right是没有意义的
  2. if target < nums[mid]: right = mid 此时mid不满足条件,在左闭右开的情况下,right可以移动到mid上
  3. if target > nums[mid]: left = mid + 1 左区间一直是有效的
  4. 初始化 right = len(nums)
class Solution:def search(self, nums: List[int], target: int) -> int:# 左闭右开区间left = 0right = len(nums)while left < right:mid = left + (right - left) // 2if target < nums[mid]:right = midelif target > nums[mid]:left = mid + 1else:return midreturn -1

看题解之后

区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)

35.搜索插入位置

有序数组且数组元素不重复,可以使用二分查找。只有最后返回的时候不一样,返回left的值

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 左闭右闭区间left = 0right = len(nums) - 1while left <= right:mid = left + (right - left) // 2if target < nums[mid]:right = mid - 1elif target > nums[mid]:left = mid + 1else:return midreturn leftclass Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 左闭右开区间left = 0right = len(nums)while left < right:mid = left + (right - left) // 2if target < nums[mid]:right = midelif target > nums[mid]:left = mid + 1else:return midreturn left

34. 在排序数组中查找元素的第一个和最后一个位置

有序数组,但是数组元素不唯一,找到元素的第一个和最后一个位置。有序数组的话就可以使用二分查找了,重复元素会让题目变得复杂

直接看题解,先寻找左右边界,然后根据寻找到的左右边界进行判定

情况一:

target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}

此时代码中在寻找左右边界时有一个边界为初始值

情况二:

target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}

此时代码left_border = 0, right_border = 1

情况三:

target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}

此时代码left_border = 0, right_border = 2

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:# 寻找左边界def getLeftBorder(nums, target):# 左闭右闭区间left = 0right = len(nums) - 1left_border = -2while left <= right:mid = left + (right - left) // 2if target <= nums[mid]:right = mid - 1left_border = rightelse:left = mid + 1return left_borderdef getRightBorder(nums, target):# 左闭右闭区间left = 0right = len(nums) - 1right_border = -2while left <= right:mid = left + (right - left) // 2if target < nums[mid]:right = mid - 1else:left = mid + 1right_border = leftreturn right_borderleft_border = getLeftBorder(nums, target)right_border = getRightBorder(nums, target)# 情况一if left_border == -2 or right_border == -2:return [-1, -1]# 情况三if right_border - left_border > 1:return [left_border+1, right_border-1]# 情况二return [-1, -1]

69.x 的平方根

思路:使用二分查找的思路,left=0,right=x,得到mid,mid的平方和x进行比较。主要是思考返回值

class Solution:def mySqrt(self, x: int) -> int:left = 0right = xwhile left <= right:mid = left + (right - left) // 2if mid * mid > x:right = mid - 1elif mid * mid < x:left = mid + 1else:return midreturn right

看了其中一个题解,这种提前确定答案的也比较好理解

  • mid * mid > x时,mid肯定不能满足条件,r=mid-1
  • mid * mid <= x时,mid有可能满足条件
class Solution:def mySqrt(self, x: int) -> int:l, r, ans = 0, x, -1while l <= r:mid = (l + r) // 2if mid * mid <= x:ans = midl = mid + 1else:r = mid - 1return ans

367.有效的完全平方数

这个题目和平方根实质是一样的,更简单一点,都不用考虑返回值

class Solution:def isPerfectSquare(self, num: int) -> bool:left = 1right = numwhile left <= right:mid = left + (right - left) // 2if mid * mid == num:return Trueelif mid * mid < num:left = mid + 1else:right = mid - 1return False

27. 移除元素

暴力法:第一层循环遍历每个元素,在遇到val时,循环后移所有元素

双指针法:快指针对应循环遍历,慢指针对应排除掉val元素后的序列

class Solution:def removeElement(self, nums: List[int], val: int) -> int:slow = 0for i in range(len(nums)):if nums[i] != val:nums[slow] = nums[i]slow += 1return slow

26.删除排序数组中的重复项

class Solution:def removeDuplicates(self, nums: List[int]) -> int:# 使用快慢指针,快指针进行循环遍历,慢指针对应删除重复元素后的序列slow = 1for i in range(1, len(nums)):if nums[i] != nums[slow-1]:nums[slow] = nums[i]slow += 1return slow

283.移动零

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 和移除元素一个意思,val==0的特殊情况slow = 0for i in range(len(nums)):if nums[i] != 0:nums[slow] = nums[i]slow += 1# 对剩下的元素赋值为0for i in range(slow, len(nums)):nums[i] = 0

844.比较含退格的字符串

可以使用栈的思路;也可以从字符串后面开始比较,定义常量skip记录当前待删除的字符的数量

977.有序数组的平方

指针指向两端,数值大的放在结果数组结尾

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:res = [0] * len(nums)i = 0j = len(nums) - 1index = jwhile i <= j:if nums[i] * nums[i] <= nums[j] * nums[j]:res[index] = nums[j] * nums[j]j -= 1else:res[index] = nums[i] * nums[i]i += 1index -= 1return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot之@Conditional衍生条件装配详解

文章目录 ☃️前言☃️简介☃️示例❄️❄️ConditionalOnProperty❄️❄️ConditionalOnClass❄️❄️ConditionalOnBean❄️❄️自定义条件 ☃️SpringBoot源码中使用☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客…

pET-28a(+)是什么,怎么看?-实验操作系列-1

01 典型的pET-28a()质粒遗传图谱 02 元件解读 Origin复制子&#xff1a;ColE1/pMB1/pBR322/pUC ori——起始载体的复制&#xff1b;f1 ori——f1噬菌体复制子&#xff0c;显示正义链合成方向。The origin of replication&#xff0c;由复制起始位点和相关调控元件组成&#xf…

Midjourney-01 初试上手 注册使用并生成你的第一张AI图片 详细流程 提示词 过程截图 生成结果 付费文生图的天花板!

背景介绍 Midjourney是一款基于人工智能技术的绘画软件&#xff0c;利用深度学习算法来辅助用户进行绘画创作。这款软件能够通过用户输入的文本描述生成图像&#xff0c;支持多种生成方式&#xff0c;包括文字生成图片、图片生成图片和混合图片生成图片。 图像生成方式&#…

Vscode根据Makefile文件使用make编译程序配置文件launch.json,task.json

视频介绍: VsCode使用make编译程序配置_哔哩哔哩_bilibili task.json: 2024年4.20 ctrl shift b 编译 {"version": "2.0.0","tasks": [{"label": "build_suricata","type": "shell","command…

【智能算法】蜉蝣算法(MA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;K Zervoudakis等人受到自然界蜉蝣交配繁殖行为启发&#xff0c;提出了蜉蝣算法&#xff08;Mayfly Algorithm, MA&#xff09;。 2.算法原理 2.1算法思想 MA灵感来自蜉蝣交配…

python 文件打包(使用pyinstaller)

PyInstaller是一个流行的Python打包工具&#xff0c;它可以将Python代码打包成可执行文件&#xff0c;使得你可以在没有安装Python解释器的环境中运行你的应用程序。&#xff1a; 安装 使用pip命令来安装PyInstaller。在终端或命令提示符中运行以下命令&#xff1a; 打包 先…

如何高效的压缩GIF图片?一键搞定GIF动图压缩 就是这么简单

一&#xff0c;引言 压缩GIF动图是一个常见的需求&#xff0c;无论是在社交媒体上分享动态表情&#xff0c;还是在网页设计中添加动态元素&#xff0c;GIF动图都扮演着重要的角色。然而&#xff0c;过大的GIF文件大小可能会导致加载速度慢&#xff0c;影响用户体验。因此&…

linux 驱动-匹配1 (platform_bus_type)

目录 匹配入口 匹配顺序(platform_match ) 方式1: 方式2&#xff08;重点&#xff09; 方式3 方式4 (重点) 匹配入口 driver_match_device 实际调用platform_match driver_match_device(drv, dev);static inline int driver_match_device(struct device_driver *drv,str…

代码随想录学习Day 30

860.柠檬水找零 题目链接 讲解链接 思路&#xff1a;需要找零的情况是顾客支付10元或20元&#xff0c;尤其是支付20元时需要考虑找零的方式&#xff0c;此时可以选择找零3张5元或者一张10元一张5元&#xff0c;按照贪心算法的思路来看&#xff1a; 局部最优&#xff1a;在找…

常见的数据抽取工具对比

1.什么是ETL? ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程&#xff0c;是数据仓库的生命线。 …

中红医疗:纷享销客CRM系统如何助力​数字化“狂飙”

纷享销客深耕 CRM 多年&#xff0c;可以顺畅打通 CRM 和 ERP 系统客户资源池&#xff0c;将金蝶苍穹平台的物料、产品基础主数据作为档案同步到纷享销客&#xff0c;以便商务维护好产品及库存。 纷享销客通过成熟的集成方案提高系统耦合性&#xff0c;让销售实时获得新产品及营…

鸿蒙开发模拟器的坑, No Devices

问题 我已经安装了模拟器&#xff0c;并且模拟器已经运行了 在Device Manager页面开启模拟器 No Devices 但是这里没有模拟器的选项 解决 添加环境变量 下面步骤 1、清除用户数据 2、 关闭Device Manager 3、 关闭ide 重启ide、开启模拟器 看到有模拟器的选项了

目标检测算法——YOLO-Word——算法详解

一、概述 1、是什么 是一个目标检测器,通过结合CLIP文本编码器,拥有了开放检测(推理时识别训练时没有的目标)的能力。作者实验证明ap 指标上 zero shot能力YOLO-world L接近专门训练过的YOLOv6-8 S 模型的能力,finetune 后YOLO-world 均能提升8个点左右。 2、亮点 将文章…

LangChain入门指南:构建高可复用、可扩展的LLM应用程序 PDF书籍分享

今天又来给大家推荐一本大模型方面的书籍<Langchain入门指南>这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章&#xff0c;从LLM基础知识开始&#xff0c;通过LangChain这个开源框架为读者解读整个LLM应用开发流程。 下载当前…

用于自动化机器陀螺仪传感器:XV7081BB

介绍一款用于自动化机器的数字输出型陀螺仪传感器XV7081BB。这款新推出的陀螺仪XV7081BB到底有什么魅力呢?我们可以用常用款用于智能割草机的XV7011BB作对比:XV7081BB提供16位或24位分辨率的角速率输出速率范围为400s。而XV7011BB采用16位角速度输出&#xff0c;检测范围为100…

[MySQL]运算符

1. 算术运算符 (1). 算术运算符 : , -, *, / 或 DIV, % 或MOD. (2). 例 : (3). 注 : DUAL是伪表.可以看到4/2结果为小数&#xff0c;并不会截断小数部分.(可能与其他语言不同&#xff0c;比如java中&#xff0c;两个操作数如果是整数&#xff0c;则计算得到的也是整数&…

sebaKMT赛巴测漏仪 听漏仪维修HL5000 HL7000

赛巴听漏仪&#xff0c;作为一款应用于供水系统漏损检测的专业设备&#xff0c;在业内有着很广泛的应用。然而&#xff0c;任何仪器在使用过程中都难免会遇到一些问题&#xff0c;赛巴听漏仪也不例外。针对这些问题&#xff0c;专业的维修服务显得尤为重要。 首先&#xff0c;赛…

【Linux系统编程】第七弹---权限管理操作(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(一) 2、有无权限的表现 总结 上一弹我们讲解了Linux权限概念相关的知识&#xff0c;但是我们只知道有…

配置全局代理上网

#准备一台机器(160)&#xff0c;DNS注释掉 直接访问不行 curl https://www.baidu.com #代理访问OK curl -x 192.141.46.161:8888 https://www.baidu.com #CentOS设置全局代理 vi ~/.bashrc #加入以下内容 export http_proxyhttp://192.141.46.161:8888 export https_proxy…

SuperMap GIS基础产品FAQ集锦(20240422)

一、SuperMap iDesktopX 问题1&#xff1a;请问一下&#xff0c;执行“要素数据集平滑”算子报错“Could not find a SpatialRDDProvider to process the params” 11.1.1 【解决办法】使用大数据下的算子配置大数据环境不正确&#xff0c;客户数据量不多&#xff0c;可以使…