当前位置:网站首页>同时求最大值与最小值(看似简单却值得思考~)
同时求最大值与最小值(看似简单却值得思考~)
2022-08-02 03:29:00 【clarkjs】
1. 问题描述:
给定一个数组,分别输出数组中的最大值与最小值。
2. 题解:
(1)蛮力法:
这个问题未免显得过于简单,从n个数中找到最大值或者最小值,只需要比较n-1次即可,因此要想找出最大值和最小值,只需要比较2*(n-1)即2n-2次。但是,是否可以做出优化呢?接下来我们给出只需要比较2n/3 左右即可完成的方法
(2)分治算法
分治算法的核心的将一个规模比较大的问题拆分成一个个小的子问题,如下图所示:
当我们将问题拆分成只含有两个元素时,只需要一次比较即可同时得到最大值和最小值,我们来计算一下复杂度:
算法: MaxMin(A)
// 输入:数组A[i...j]
// 输出:数组A[i...j]中的max和min
if j - i + 1 = 1 Then 输出A[i], A[i],算法结束
if j - i + 1 = 2 Then
if A[i] < A[j] Then 输出A[i], A[j], 算法结束
else 输出 A[j], A[i], 算法结束
k (j - i + 1) / 2
m1, M1 MaxMin(A[i : k]);
m2, M2 MaxMin(A[k + 1 : j]);
m min(m1, m2);
M min(M1, M2);
输出m, M
(3)伪分治算法
我们先两两分组,然后一组两个数之间只需要进行一次比较即可得到最大值和最小值。现在我们有
⌊n/2⌋ 个最小值和 ⌊n/2⌋ 个最大值,如果最初为奇数个元素,那么最大值肯定在⌊n/2⌋个最大值和轮空元素之间产生,同理,最小值肯定在⌊n/2⌋个最小值和轮空元素之间产生。之后再使用冒泡的思想从这些元素中找到最大值和最小值即可得到最终解。
时间复杂度(比较次数)计算如下:
边栏推荐
猜你喜欢
一文理解分布式开发中的服务治理
[DS3231 RTC real-time clock module and Arduino interface to build a digital clock]
【科普贴】SD卡接口协议详解
连接本地MySql时出现2003-Can‘t connect to MySql server on ‘localhost‘(10061)
如何在 Scala 中科学地操作 collection(一):集合类型与操作
聊一聊数据库的行存与列存
从Attention到Self-Attention和Multi-Head Attention
网站开发方案研究
USB3.0一致性测试方法
Typora使用
随机推荐
uniCloud通讯录实战
Type c PD 电路设计
sacalatest AnyFunSuite:no implicits found for parameter pos
Transformer结构解析及常见问题
【水位传感器与 Arduino 连接测量水位】
【Arduino connects DHT11 humidity and temperature sensor】
【nRF24L01 与 Arduino 连接实现无线通信】
野火ISO-V2学习
PCB Design Ideas
[DS3231 RTC real-time clock module and Arduino interface to build a digital clock]
ICN6211:MIPI DSI转RGB视频转换芯片方案介绍 看完涨知识了呢
中国大陆开源镜像站汇总
Modify hosts file using batch script
[Spark]-协同过滤
保证接口数据安全的10种方案
【心率传感器与Arduino连接读取心率数据】
[Arduino connected to GPS module (NEO-6M) to read positioning data]
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
【Arduino 连接DHT11 湿度和温度传感器】
聊一聊数据库的行存与列存