数据结构与算法 - 数组与二分查找 + Leetcode典型题

1. 什么是数组

数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
C++中二维数组在地址空间上也是连续的。

需注意:

  • 数组的下标从0开始。
  • 数组内存空间的地址是连续的。
  • 数组的元素是不能删的,只能覆盖。

2. 二分查找

力扣题目链接
之前的题解704. 二分查找中有一些地方不够清晰,此处补充说明。
数组为有序数组+数组中无重复元素 -> 考虑二分法

  1. 在计算mid时,考虑数据溢出的可能,应将mid = (low + high) / 2;写为
	int mid = left + ((right - left) / 2); //防止溢出
  1. 二分法根据选择的区间不同,有两种解决方式,分别为:左闭右闭 [left, right] 和左闭右开 [left, right)
  • 左闭右闭 [left, right] 的情况下,nums [right] 表示数组中最后一个元素,while (left <= right) 要使用 <= ,因为 left == right 是有意义的。且每次判断if (nums[mid] > target) 后,由于nums[mid] 一定不是target ,right 要赋值为 middle - 1,right = mid - 1;,这表示下一次要查找的左区间结束下标位置为 middle - 1,即区间为 [left, middle - 1]。
    同理,if (nums[mid] < target)时, left 要赋值为 middle + 1。

  • 左闭右开 [left, right) 的情况下,nums [right] 无意义,while (left < right)中使用**<**,因为 left == right 在区间 [left, right) 是没有意义的。每次判断if (nums[mid] > target) 后,nums[mid] 不等于target ,在左区间 [left, mid) 中继续寻找.
    区间右开:right更新为mid。
    区间左闭:if (nums[mid] < target)时,left 要更新为 mid + 1

  1. 二分查找时间复杂度为 O(log n)

相关题目1:35. 搜索插入位置
补充之前题解35. 搜索插入位置-二分查找中表达不清晰的地方。
这道题存在四种情况:

  1. 目标值在数组所有元素之前
  2. 目标值等于数组中某一个元素
  3. 目标值插入数组中的某一位置
  4. 目标值在数组所有元素之后

与上一道题的差别在于1,3,4情况下的返回值。在左闭右闭 [left, right] 的情况下,right = mid - 1;,(1情况下此时 right = -1;3情况下 right 指向应插入的前一个位置;4情况下 right 指向最后一个元素的位置)所以应返回 right + 1 ,即return right + 1;;在左闭右开 [left, right) 的情况下,right = mid;,所以应返回 right ,即return right;

相关题目2:69.x的平方根 367.有效的完全平方数
题解:【LeetCode-简单】69.x的平方根 + 367.有效的完全平方数 - 二分法

相关题目3:【LeetCode-中等】34. 在排序数组中查找元素的第一个和最后一个位置 - 二分法

3. 移除元素 - 双指针

力扣题目链接
题解:【LeetCode-简单】27.移除元素 - 数组与双指针法

由于Leetcode中数组是用的vector,这道题可以用nums.erase(it);函数暴力破解,但要注意erase()函数在删除元素后会将位于该元素后方的剩余元素前移,这将导致数组长度的改变以及后续元素下标的变化,删除元素后迭代器 it 不需要 it++便已经指向了下一个元素。

不考虑vector的因素,由于数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。本题可采用双指针的方法。

双指针法(快慢指针法): 通过一个快指针慢指针在一个for循环下完成两个for循环的工作。

下面定义本题中的快慢指针:

  • 快指针:寻找新数组(不含有目标元素的数组)的元素 ,即用于寻找不等于val的元素
  • 慢指针:指向更新新数组下标的位置,即指向需要被覆盖的等于val的元素

最终慢指针一定指向了最终数组末尾的下一个元素,只要返回慢指针即可。
题目中提及元素的顺序可以改变,同向双指针和相向双指针都可以使用,如果要求不能改变元素顺序,则应该使用同向双指针。

4. 有序数组的平方 - 双指针

力扣题目链接
典型的双指针问题,暴力解法的时间复杂度是O(nlogn),而采用双指针的时间复杂度是O(n)。
题解:【LeetCode-简单】977. 有序数组的平方-双指针

5. 长度最小的子数组 - 滑动窗口

力扣题目链接

题解:【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环完成了一个不断搜索区间的过程。滑动窗口只用一个for循环来完成这个操作。

而这个循环的索引,一定是表示 滑动窗口的终止位置

直观的动画演示:
请添加图片描述
滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

	while (sum >= s) {subLength = (j - i + 1); //取子序列的长度result = result < subLength ? result : subLength;这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)sum -= nums[i++]; }

6. 螺旋矩阵II - 模拟

力扣题目链接
题解:【LeetCode-中等】59.螺旋矩阵II - 二维数组

本题并不涉及到什么算法,就是模拟过程,还要注意边界情况。

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

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

相关文章

【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题

一、背景 近期操作退役EC集群的节点。在退役的过程中,遇到了一些问题。特此总结一下。 本文描述的问题现象是: 每一批次退役10个节点,完全退役成功后开始操作下一批。 但是,中间有一批次有2台节点的Under Replicated Blocks一直是1,不往下降。 处于Decommissioning状态卡…

鸿蒙OpenHarmony多线程能力场景化示例实践

简介 在OpenHarmony应用中&#xff0c;每个 进程 都会有一个主线程&#xff0c;主线程主要承担执行UI绘制操作、管理ArkTS引擎实例的创建和销毁、分发和处理事件、管理Ability生命周期等职责&#xff0c;具体可参见 线程模型概述 。因此&#xff0c;开发应用时应当尽量避免将耗…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频&#xff0c;涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述&#xff0c;使得视频创作变得前所未有的简单和高效。 Sora的一些能力&#xff1a; Text-to-video…

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…

一个具有强大PDF处理能力的.Net开源项目

PDF具有跨平台、可读性强、不可修改性、无需特定阅读软件、内容安全等好处&#xff0c;在工作中经常都会用到。 所以&#xff0c;我们在项目开发中&#xff0c;经常需要生成PDF的文件&#xff0c;或者把Html、Xml等文件转化为PDF格式。 今天给大家推荐一个具有PDF处理能力的.…

优思学院|质量工程师需要学习什么软件?

初入职质量工程师的朋友常常会问&#xff1a;质量工程师需要学习什么软件&#xff1f;在质量控制和管理的世界里&#xff0c;拥有强大的数据分析工具是走向成功的关键&#xff0c;因此&#xff0c;对于质量工程师来说&#xff0c;掌握正确的软件不仅能提升工作效率&#xff0c;…

lv20 QT对话框3

1 内置对话框 标准对话框样式 内置对话框基类 QColorDialog, QErrorMessage QFileDialog QFontDialog QInputDialog QMessageBox QProgressDialogQDialog Class帮助文档 示例&#xff1a;各按钮激发对话框实现基类提供的各效果 第一步&#xff1a;实现组件布局&…

Pyhton的组合数据类型

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…

尝鲜18倍速大模型Groq和世界第二AI Mistral(Le Chat)

01 尝鲜 中午,一边吃饭,一边尝试一下最新的AI:Groq,它使用了重新设计的LPU,据说比英伟达的GPU快了18倍。 运行了开源的Mixtral-8x7b模型,屏幕上的文字回复几乎是瞬间的,那种速度感,让人心跳加速。 接着,我尝试了来自欧洲的新贵——Mistral AI的Le Chat。 这个三天前…

python学习笔记-内置异常

概述 Python 中的异常&#xff08;Exception&#xff09;是指在程序执行过程中遇到的错误或异常情况。当程序出现异常时&#xff0c;解释器会停止当前代码的执行&#xff0c;并试图找到匹配的异常处理器来处理异常。如果没有找到合适的异常处理器&#xff0c;程序就会终止并打…

go并发模式之----阻塞/屏障模式

常见模式之一&#xff1a;阻塞/屏障模式 定义 顾名思义&#xff0c;就是阻塞等待所有goroutine&#xff0c;直到所有goroutine完成&#xff0c;聚合所有结果 使用场景 多个网络请求&#xff0c;聚合结果 大任务拆分成多个子任务&#xff0c;聚合结果 示例 package main ​…

配电房轨道式巡检机器人方案

一、应用背景 在变电站、配电房、开关站等各种室内变配电场所内&#xff0c;由于变配电设备的数量众多、可能存在各类安全隐患&#xff0c;为了保证用电的安全可靠&#xff0c;都要进行日常巡检。 但目前配电房人工巡检方式有以下主要问题&#xff1a; 巡检工作量大、成本高 …

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求&#xff0c;对此小编整理了一些相关问题~ 一、本地部署相关条件 对于想要本地部署的小伙伴要了解&#xff0c;相对于使用StartAI试用引擎本地部署更加考验电脑硬件配置备噢~ 流畅使用要nvidia显卡&#xff0c;6g以上显存&#xff08;最…

图解知识蒸馏

soft labels与soft predictions越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做distillation loss&#xff0c;也叫soft loss。 hard label y与hard prediction越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做student loss&#xff0c…

什么是VR虚拟现实元宇宙|VR设备购买|VR设备零售店

VR&#xff08;Virtual Reality&#xff0c;虚拟现实&#xff09;元宇宙是指基于虚拟现实技术构建的一个虚拟世界&#xff0c;这个世界可以模拟现实世界或者超出现实世界的一切事物和活动。在这个虚拟世界里&#xff0c;用户可以通过虚拟现实设备&#xff08;如头戴式显示器、手…

本地搭建xss平台并获取cookie演练

前言 一般而言&#xff0c;搭建xss平台是不被允许的&#xff0c;但是由于教育的目的&#xff0c;搭建xss平台更能让学习者更加直观感受xss漏洞对我们的危害和它的重要性。 搭建xss平台 1.搭建xss平台的基础是在phpstudy一个集成环境上的&#xff0c;所有第一步要安装phpstudy&a…

XSS中级漏洞(靶场)

目录 一、环境 二、正式开始闯关 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x0B 0x0C 0x0D 0x0E ​ 0x0F 0x10 0x11 0x12 一、环境 在线环境&#xff08;gethub上面的&#xff09; alert(1) 二、正式开始闯关 0x01 源码&#xff1a; 思路&#xff1a;闭…

前后端依赖下载上传

在某些情况下&#xff0c;可能需要在没有互联网连接的环境中进行构建或部署。通过提前下载所有依赖&#xff0c;你可以将它们保存在本地&#xff0c;然后在没有网络连接时使用&#xff0c;提高构建或部署的效率。 前端下载依赖 脚本getTzgUrl.js const { readFileSync, writ…

SpringBoot整合rabbitmq-扇形交换机队列(三)

说明&#xff1a;本文章主要是Fanout 扇形交换机的使用&#xff0c;它路由键的概念&#xff0c;绑定了页无用&#xff0c;这个交换机在接收到消息后&#xff0c;会直接转发到绑定到它上面的所有队列。 大白话&#xff1a;广播模式&#xff0c;交换机会把消息发给绑定它的所有队…

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)

目录 TCP超时重传拥塞控制概述慢启动和拥塞避免下面讲解发送端如何判断拥塞发生。 快速重传和快速恢复 本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务 TCP超时重传 tcp服务能够重传其超时时间内没有收到确认的TCP报文段&#xff0c;tcp模块为每一个报文段都…