面试中算法(无序数组排序后最大相邻差)

server/2024/9/23 3:33:55/

     有一个无序整型数组,求该数组排序后的任意两个相邻元素的最大差值;要求时间复杂度和空间复杂度尽可能低。

  (1)任意一种时间复杂度为O (nlogn)的排序算法(如快速排序)给原数组排序,然后遍历排好序的数组,并对每两个相邻元素求差,最终得到最大差值。 该解法的时间复杂度是O (nlogn),在不改变原数组的情况下,空间复杂度是O (n)。

 (2)计数排序的思想,先找出原数组中最大值和最小值的差。但如果原数组只有3个元素:2,3,1000000,这样就要创建1000000个数组,不可行!

  优化方法:使用桶排序的思想(不直接进行桶排序),可以做到时间复杂度O(N),空间复杂度O(N)。 

class Bucket:def __init__(self):self.max=Noneself.min=Nonedef get_max_sub2(ll):#1.获取最大值和最小值max_v=max(ll)min_v=min(ll)d=max_v-min_v# print(max_v,min_v)#如果等于0,则返回0if d==0:return 0#2.初始化桶bucket_len=len(ll)buckets=[]for i in range(bucket_len):buckets.append(Bucket())print(buckets[i].max,buckets[i].min)#3.循环原数列,确定每个桶的最大值和最小值for i in range(len(ll)):#确定数组元素桶的下标index=int((ll[i]-min_v)*(bucket_len-1)/d)#判断最大值为空或桶的最大值小于原数列if buckets[index].max is None or buckets[index].max<ll[i]:buckets[index].max=ll[i]if buckets[index].min is None or buckets[index].min>ll[i]:buckets[index].min=ll[i]print(index,buckets[index].max,buckets[index].min)#4.循环桶,找最大差值#默认左边的第一个最大leftMax=buckets[0].max# 最大差dis_max=0#循环从第2个开始for i in range(1,len(buckets)):#如果最小值为空,继续循环if buckets[i].min is None:continue#如果最小值-第1个最大值大于最大差if buckets[i].min-leftMax>dis_max:dis_max=buckets[i].min-leftMax#获取到最大值leftMax=buckets[i].maxreturn dis_maxif __name__ == '__main__':ll=[22,26,25,21,28,20,34]print(ll)print('-'*20)print("最大差值:",get_max_sub2(ll))

 


http://www.ppmy.cn/server/34201.html

相关文章

【可实战】被测需求理解(需求文档是啥样的、从哪些角度进行需求评审、需求分析需要分析出哪些内容、如何提高需求分析能力)

产品人员会产出一个需求文档&#xff0c;然后组织一个需求的宣讲。测试人员的任务就是在需求宣讲当中&#xff0c;分析需求有没有存在一些问题&#xff0c;然后在需求宣讲结束之后通过分析需求文档&#xff0c;分析里面的测试点并预估一个排期。 一、需求文档是什么样的&#x…

Go中如何将io.Writer转换成字符串(将两个管道连接的exec.Command输出的标准输出获取成字符串)

假设我们需要在Go中运行下面的命令&#xff1a; PS -A | grep wget这里需要写成两个exec.Command&#xff0c;如下&#xff0c;第一个命令为cmd&#xff0c;第二个为cmd2&#xff1a; cmd : exec.Command("PS", "-A") cmd2 : exec.Command("grep&qu…

自动驾驶融合定位系列教程五:惯性导航误差分析

自动驾驶融合定位系列教程五&#xff1a;惯性导航误差分析 一、概述 在定位领域的几乎所有多传感器融合系统中&#xff0c;都有IMU存在&#xff0c;而且&#xff0c;IMU是定位系统的主线与核心&#xff08;对此可能很多人并不同意&#xff0c;但是我仍然坚定地坚持这一观点&a…

自动驾驶领域涉及的五种算法

在自动驾驶领域&#xff0c;涉及到以下五种算法&#xff1a; 感知算法&#xff1a;感知算法用于从传感器数据中提取环境信息&#xff0c;包括物体检测、目标跟踪、道路识别等。这些算法可以通过视觉传感器&#xff08;如摄像头&#xff09;、激光雷达、雷达等来获取环境信息。 …

Android Studio学习笔记——数据库存储

Android Studio学习笔记——数据库存储 6.1持久化技术简介6.2 文件存储将数据存储到文件中从文件中读取数据 6.3 SharedPreferences存储6.3.1 将数据存储到是SharedPreferences中6.3.2 从SharedPreferences中读取数据6.3.3 实现记住密码功能 6.4 SQLite数据库存储6.4.1 创建数据…

hadoop学习---Hive分桶表的机制及其查询优化方案

什么是分桶表&#xff1f; 分桶是将数据集分解成更容易管理的若干部分的一个技术&#xff0c;是比分区更为细粒度的数据范围划分。 主要是用于分文件的&#xff0c;在建表的时候&#xff0c;指定按照那些字段执行分桶操作&#xff0c;并可以设置需要分多少个桶&#xff0c;当插…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…