c 取数组 最大值 算法_拜托,面试别再问我最大值最小值了!!!
如何从n个数里找到最大值?
很容易想到,用一个循环就能搞定。
int find_max(int arr[n]){
int max = -infinite;
for(int i=0; i
if(arr[i]>max)
max=arr[i];
return max;
}
这里,需要执行n-1次比较。
如何从n个数里找到最大值与最小值?
很容易想到,用一个循环找到最大值和最小值,就能搞定。
(int, int) find_max_min(int arr[n]){
int max = -infinite;
int min = infinite;
for(int i=0; i
if(arr[i]>max)
max=arr[i];
if(arr[i]
min=arr[i];
}
return (max, min);
}
这里,需要执行2*(n-1)=2n-2次比较。
还有没有更快的方法呢?
分治法或许可以派上用场,分治法的思路是:
(1)把大规模拆分成小规模;
(2)小规模分别求解;
(3)小规模求解之后,再综合求解大规模;
看能不能往这个例子里套用:
(1)将arr[0,n]分为arr[0,n/2]和arr[n/2,n];
(2)每个子数组分别求解最大值和最小值;
(3)两个子数组的最大值里再取最大值,两个子数组的最小值里再取最小值,就是最终解;
伪代码大概是这样:
(int, int) find_max_min(int arr[0,n]){
// 递归左半区
(max1, min1) = find_max_min(arr[0, n/2]);
// 递归右半区
(max2, min2) = find_max_min(arr[n/2, n]);
// 再计算两次
max = max1>max2?max1:max2;
min = min1
return (max, min);
}
画外音,实际的递归代码要注意:
(1)入参不是0和n,而是数组的下限和上限;
(2)递归要收敛,当数组的上下限相差1时,只比较一次,直接返回max和min,而不用再次递归;
分治法之后,时间复杂度是多少呢?
如果你是“架构师之路”的老读者,《搞定所有时间复杂度计算》一文,能够轻松求解分治法的时间复杂度分析:
当只有2个元素时,只需要1次计算就能知道最大,最小值
当有n个元素时,
(1)递归左半区;
(2)递归右半区;
(3)再进行两次计算;
f(2)=1;【式子A】
f(n)=2*f(n/2)+2;【式子B】
求解递归式子,得到:
f(n)=1.5n-2;
画外音,证明过程如下:
【式子B】不断展开能得到:
f(n)=2*f(n/2)+2;【式子1】
f(n/2)=2*f(n/4)+2;【式子2】
f(n/4)=2*f(n/8)+2;【式子3】
...
f(n/2^(m-1))=2*f(2^m)+2;【式子m】
通过这m个式子的不断代入,得到:
f(n)=(2^m)*f(n/2^m)+2^(m+1)-2;【式子C】
由于f(2)=1【式子A】;
即【式子C】中n/2^m=2时,f(n/2^m)=f(2)=1;
此时n=2^(m+1),代入【式子C】
即f(n)=n/2 + n -2 = 1.5n-2;
证明过程很严谨,但我知道你没看懂。
建议再看看《搞定所有时间复杂度计算》。
总结,n个数:
求最大值,遍历,需要n-1次计算
求最大最小值,遍历,需要2n-2次计算
求最大最小值,分治,时间复杂度1.5n-2
画外音:别跳出,文末有作业。
思路比结论重要,希望大家有收获。
架构师之路-分享可落地的技术文章
推荐阅读:
《世界上最漂亮的排序算法》
《TopK与快速排序深度解析》
《搞定所有时间复杂度计算》
《拜托,面试别再问我基数排序了!》
《拜托,面试别再问我计数排序了!》
《拜托,面试别再问我桶排序了!》
作业题,n个数:
(1)求最大值,n-1次计算,是最快的方法吗?
(2)求最大最小值,1.5n-2,是最快的方法吗?
c 取数组 最大值 算法_拜托,面试别再问我最大值最小值了!!!相关推荐
- 第二十一期:拜托!面试不要再问我Spring Cloud底层原理
毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术. 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知 ...
- websphere mq 查看队列中是否有数据_如果面试官再问你消息队列,就把这篇甩给他!...
★★★建议星标我们★★★ 公众号改版后文章乱序推荐,希望你可以点击上方"Java进阶架构师",点击右上角,将我们设为★"星标"!这样才不会错过每日进阶架构文章呀 ...
- 拜托!面试不要再问我Spring Cloud底层原理
毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术. 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知 ...
- git如何切换分支_拜托,不要再问我Git分支如何使用
今天来讲讲我使用Git分支的一些经验,记录一下,希望对大家有帮助. 阐述 在平常开发中,一般都会对应三种环境,本地环境.测试环境.线上环境.开发的基本流程都是先在本地环境开发好,再把代码发布到测试环境 ...
- qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...
前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...
- 线程的几种状态_拜托:不要再问我线程有多少种状态了
废话不多说,有六种状态 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中, 有几种状态呢?在Thread类中包含了个State枚举类,State枚举类 ...
- c语言减治法求a的n次方算法,拜托,面试别再问我斐波那契数列了!!!
面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...
- 拜托,面试别再问我斐波那契数列了!!!
面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...
- 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!
0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...
最新文章
- 年仅 16 岁的黑客少年,竟是搅乱 IT 巨头的幕后主使?
- 报名 | 二值化网络 基于素描图的图像检索论坛
- SAP QM 内向交货单在完成包装之后就自动触发了检验批?
- .net上传,一个选择直接上传(ashx)和byteArray上传
- 一个毕设的建成——记录下我毕设途中的《SOP》
- avue中实现消息的实时展示
- C#算法设计排序篇之06-堆排序(附带动画演示程序)
- 如果打开MSSQL server 显示无项目的解决方法
- “抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!...
- mobi格式电子书_这几种电子书格式的关系与区别,资深Kindler有必要了解了解 !...
- Python版点菜订单
- vscode开发python使用教程_VSCode 支持Python
- cmd echo写入shell_为什么说Shell脚本就是最好的教程和笔记呢?
- 虚拟机下liunx安装jdk
- Linux桌面系统远程访问全解析
- vtk 提取等值面并显示
- CSS3(三)Animation 入门详解
- SQL 基础(五)数据查询实战演练一
- 数字统计之统计页码数字出现的次数
- 3.15 study 简单移动动画js实现