一个数组,只考虑速度,怎么获取最大值以及最小值?

方法一:使用 Math.max 和 Math.min 结合扩展运算符

Math.max 和 Math.min 是 JavaScript 内置函数,可分别返回一组数中的最大值和最小值。结合扩展运算符 ... 能直接处理数组。

function getMaxMinByMath(arr: number[]): [number, number] {const max = Math.max(...arr);const min = Math.min(...arr);return [max, min];
}const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
const [max, min] = getMaxMinByMath(arr);
console.log(`最大值: ${max}, 最小值: ${min}`);
复杂度分析
  • 时间复杂度:O(n),扩展运算符会遍历数组中的每个元素。
  • 空间复杂度:O(n),在内部会展开数组。
  • 优点:代码简洁直观。
  • 缺点:当数组非常大时,可能会导致栈溢出错误,因为扩展运算符会一次性将数组元素展开。

方法二:手动遍历数组

手动遍历数组,在遍历过程中记录最大值和最小值。

function getMaxMinByLoop(arr: number[]): [number, number] {if (arr.length === 0) {return [NaN, NaN];}let max = arr[0];let min = arr[0];for (let i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}return [max, min];
}const arr2 = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
const [max2, min2] = getMaxMinByLoop(arr2);
console.log(`最大值: ${max2}, 最小值: ${min2}`);
复杂度分析
  • 时间复杂度:O(n),需要遍历数组中的每个元素一次。
  • 空间复杂度:O(1),只使用了常数级的额外变量。
  • 优点:不会有栈溢出风险,性能稳定,适合处理大规模数组。
  • 缺点:代码相对冗长。

方法三:使用 reduce 方法

reduce 方法可以对数组中的每个元素执行一个自定义的回调函数,并将结果累积起来。

function getMaxMinByReduce(arr: number[]): [number, number] {if (arr.length === 0) {return [NaN, NaN];}const [max, min] = arr.reduce(([accMax, accMin], current) => {return [current > accMax ? current : accMax,current < accMin ? current : accMin];}, [arr[0], arr[0]]);return [max, min];
}const arr3 = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
const [max3, min3] = getMaxMinByReduce(arr3);
console.log(`最大值: ${max3}, 最小值: ${min3}`);
复杂度分析
  • 时间复杂度:,会遍历数组中的每个元素。
  • 空间复杂度:,只使用了常数级的额外空间。
  • 优点:代码相对简洁,利用了数组的高阶函数。
  • 缺点:对于不熟悉 reduce 方法的开发者来说,代码理解成本较高。

方法四: 排序法

先对数组进行排序,排序后数组的第一个元素就是最小值,最后一个元素就是最大值。

function findMaxMinBySort(arr) {if (arr.length === 0) {return [null, null];}const sortedArr = [...arr].sort((a, b) => a - b);const min = sortedArr[0];const max = sortedArr[sortedArr.length - 1];return [max, min];
}const array3 = [4, 6, 1, 9, 3];
const [maxResult, minResult] = findMaxMinBySort(array3);
console.log(`最大值: ${maxResult}, 最小值: ${minResult}`);

复杂度分析

  • 时间复杂度:O(nlogn),主要是排序操作的时间复杂度,常见的排序算法如快速排序、归并排序的平均时间复杂度为 O(nlogn)。
  • 空间复杂度:O(n),通常排序算法需要额外的空间来存储排序后的数组。

方法五:冒泡排序 

function getMaxMinByBubble(arr) {if (arr.length === 0) {return [null, null];}let len = arr.length;// 通过一轮冒泡找出最大值for (let i = 0; i < len - 1; i++) {if (arr[i] > arr[i + 1]) {// 交换 arr[i] 和 arr[i + 1]let temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}// 经过一轮冒泡,最后一个元素是最大值let max = arr[len - 1];// 通过一轮反向冒泡找出最小值for (let i = len - 1; i > 0; i--) {if (arr[i] < arr[i - 1]) {// 交换 arr[i] 和 arr[i - 1]let temp = arr[i];arr[i] = arr[i - 1];arr[i - 1] = temp;}}// 经过一轮反向冒泡,第一个元素是最小值let min = arr[0];return [max, min];
}const array = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
const [maxValue, minValue] = getMaxMinByBubble(array);
console.log(`最大值: ${maxValue}, 最小值: ${minValue}`);

复杂度分析

  • 时间复杂度:O(n)。虽然使用了冒泡排序的思想,但我们只进行了两轮线性的遍历操作,每轮遍历数组中的元素一次,所以总的时间复杂度为O(n) ,其中 n  是数组的长度。
  • 空间复杂度:O(1)。只使用了常数级的额外变量(如 temp 用于交换元素),没有使用额外的数据结构来存储大量数据,所以空间复杂度为常数级别。

 

性能对比与选择建议

  • 若数组规模较小,使用 Math.max 和 Math.min 结合扩展运算符的方法代码最为简洁。
  • 若数组规模较大,手动遍历数组的方法性能更稳定,不会有栈溢出风险。
  • reduce 方法在性能上和手动遍历相近,但代码简洁性介于前两者之间,适合熟悉高阶函数的开发者。
  • 排序法虽然能得到结果,但排序操作的时间复杂度较高,在只需要找出最大值和最小值的场景下,不是最优选择。

  • 冒泡虽然能获取到最大值和最小值,但相比直接遍历数组比较元素大小(手动遍历数组的方法),代码会更复杂一些,因为涉及到元素交换的操作。不过它依然是一种可行的方式,并且能在  的时间复杂度内完成任务。而和使用 Math.max 与 Math.min 或者 reduce 方法相比,代码的简洁性较差,但原理更加直观易懂,适合对算法原理进行学习和理解。

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

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

相关文章

Word 里面嵌入DeepSeek

目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档&#xff0c;按 AltF11&#xff0c;进入VB界面。 2、选中文档&#xff0c;右键->插入->模块。 3、进入模块&#xff0c;粘入…

java面试题-集合篇

Collection 1.Collection有哪些类&#xff1f; Java集合框架中的Collection接口是所有集合类的基础接口&#xff0c;定义了一些基本的集合操作&#xff0c;如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。 List List接口定义了按照索引…

国内 网络安全沙箱

CSRF攻击 CSRF攻击概述&#xff1a; CSRF&#xff08;Cross Site Request Forgery, 跨站域请求伪造&#xff09;是一种网络的攻击方式&#xff0c;它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患&#xff0c;比如 SQL 脚本注入&#xff0c;跨站域脚本攻击等在近…

Web3 的虚实融合之路:从虚拟交互到元宇宙构建

在这个数字技术日新月异的时代&#xff0c;我们正站在 Web3 的门槛上&#xff0c;见证着互联网的又一次革命。Web3 不仅仅是技术的迭代&#xff0c;它代表了一种全新的交互方式和价值创造模式。本文将探讨 Web3 如何推动虚拟交互的发展&#xff0c;并最终实现元宇宙的构建&…

项目中菜单按照层级展示sql

效果如图&#xff1a; 直接上脚本 查四级菜单 select EFT_FLAG,MENU_ID, CASE LEN(MENU_LVL)WHEN 4THEN MENU_NAME ELSE - END AS MENU_NAME1, CASE LEN(MENU_LVL)WHEN 8THEN MENU_NAME ELSE - END AS MENU_NAME2, CASE LEN(MENU_LVL)WHEN 12THEN MENU_NAME ELSE - END …

Reasoning in High Gear 推理加速发展

Reasoning in High Gear 推理加速发展 关键信息&#xff1a;OpenAI推出GPT - 3 - mini&#xff0c;它是GPT - 1模型后续版本&#xff0c;在速度、成本及特定领域能力上有显著优势。 模型特性 推理强度可选&#xff1a;提供低、中、高三个推理 “强度” 级别&#xff0c;不同级别…

Linux驱动层学习:LED 驱动开发

前置知识&#xff1a; 1、地址映射 MMU 全称叫做 Memory Manage Unit&#xff0c;也就是内存管理单元。 MMU 主要完成的功能如下&#xff1a; ①、完成虚拟空间到物理空间的映射。 ②、内存保护&#xff0c;设置存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性。 第…

数据挖掘智能Agent

&#x1f917; CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说&#xff0c;往往既复杂又令人头疼&#xff0c;需要耗费大量精力进行重复性工作。为了解决这一问题&#xff0c;我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…

【C++】Vector容器

为什么要学习vector&#xff1f; 1. 上一章分享了string&#xff0c;而string实际上是一个管理字符的顺序表。 2. 而除了字符以外&#xff0c;我们经常用到整形数组&#xff0c;所以我们需要针对其他类型数据的顺序表。 3. vector实际上也是一个顺序表&#xff0c;而且主要用来…

国内 ChatGPT Plus/Pro 订阅教程

1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果升级入口无法点击&#xff0c;那就访问这个网址&#xff0c;htt…

Winform禁止高分辨下缩放布局成功方法

Windows自动缩放布局会导致窗体上的按钮和文本挤在一起根本看不清楚。 那么该如何解决呢&#xff1f; 具体操作步骤如下&#xff1a; 1、在项目属性上切换到【安全性】菜单&#xff0c;勾选【启用ClickOnce安全设置】&#xff0c;然后立刻取消勾选&#xff1b; 为了生成app.…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

span标签 鼠标移入提示框 el-tooltip element-ui

<el-tooltip :content"item.value" placement"top"><span>{{ item.valueHidden }}</span></el-tooltip>

[创业之路-300]:进一步理解货币与金钱, 货币与货币政策

目录 一、货币 1.1 概述 1、货币的定义 2、货币的形态演变 3、货币的职能 4、货币的价值衡量 1.2 货币的分层 1、货币分层的目的与意义 2、货币分层的划分标准与层次 3、各国货币分层的实践 4、货币分层的影响与应用 1.3、M0、M1、M2变化对股市的影响 1、M0变化对…

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…

vue+springboot+webtrc+websocket实现双人音视频通话会议

前言 最近一些时间我有研究&#xff0c;如何实现一个视频会议功能&#xff0c;但是找了好多资料都不太理想&#xff0c;最终参考了一个文章 WebRTC实现双端音视频聊天&#xff08;Vue3 SpringBoot&#xff09; 只不过&#xff0c;它的实现效果里面只会播放本地的mp4视频文件&…

nginx播放视频(auth_request鉴权)

学习链接 Nginx通过auth_request结合Springboot实现静态文件下载鉴权 nginx搭建直播推流服务&推流拉流鉴权 步骤 1、安装nginx 这里nginx的版本是nginx-1.24.0 ./configure --with-http_ssl_module --with-stream --with-stream_ssl_module --with-http_auth_req…

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…

Webpack相关优化总结

在使用webpack时提供了各种配置&#xff0c;这里结合在业务中常用的配置汇总一下可以进行的一系列的webpack优化 缩小文件搜索范围 其原理是在构建时&#xff0c;会以用户配置的Entry为开始依次递归遍历每个Module&#xff0c;在遍历每个Module时会调用相应合适的Loader对原模…