如何从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 取数组 最大值 算法_拜托,面试别再问我最大值最小值了!!!相关推荐

  1. 第二十一期:拜托!面试不要再问我Spring Cloud底层原理

    毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术. 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知 ...

  2. websphere mq 查看队列中是否有数据_如果面试官再问你消息队列,就把这篇甩给他!...

    ★★★建议星标我们★★★ 公众号改版后文章乱序推荐,希望你可以点击上方"Java进阶架构师",点击右上角,将我们设为★"星标"!这样才不会错过每日进阶架构文章呀 ...

  3. 拜托!面试不要再问我Spring Cloud底层原理

    毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术. 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知 ...

  4. git如何切换分支_拜托,不要再问我Git分支如何使用

    今天来讲讲我使用Git分支的一些经验,记录一下,希望对大家有帮助. 阐述 在平常开发中,一般都会对应三种环境,本地环境.测试环境.线上环境.开发的基本流程都是先在本地环境开发好,再把代码发布到测试环境 ...

  5. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...

    前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...

  6. 线程的几种状态_拜托:不要再问我线程有多少种状态了

    废话不多说,有六种状态 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中, 有几种状态呢?在Thread类中包含了个State枚举类,State枚举类 ...

  7. c语言减治法求a的n次方算法,拜托,面试别再问我斐波那契数列了!!!

    面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...

  8. 拜托,面试别再问我斐波那契数列了!!!

    面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...

  9. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

    0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...

最新文章

  1. 年仅 16 岁的黑客少年,竟是搅乱 IT 巨头的幕后主使?
  2. 报名 | 二值化网络 基于素描图的图像检索论坛
  3. SAP QM 内向交货单在完成包装之后就自动触发了检验批?
  4. .net上传,一个选择直接上传(ashx)和byteArray上传
  5. 一个毕设的建成——记录下我毕设途中的《SOP》
  6. avue中实现消息的实时展示
  7. C#算法设计排序篇之06-堆排序(附带动画演示程序)
  8. 如果打开MSSQL server 显示无项目的解决方法
  9. “抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!...
  10. mobi格式电子书_这几种电子书格式的关系与区别,资深Kindler有必要了解了解 !...
  11. Python版点菜订单
  12. vscode开发python使用教程_VSCode 支持Python
  13. cmd echo写入shell_为什么说Shell脚本就是最好的教程和笔记呢?
  14. 虚拟机下liunx安装jdk
  15. Linux桌面系统远程访问全解析
  16. vtk 提取等值面并显示
  17. CSS3(三)Animation 入门详解
  18. SQL 基础(五)数据查询实战演练一
  19. 数字统计之统计页码数字出现的次数
  20. 3.15 study 简单移动动画js实现

热门文章

  1. 1.7 LINUX启动流程
  2. 6个好用的Web开发工具
  3. 珍藏40个android应用源码分享
  4. 2013年第8周日元宵节
  5. 如何迅速定位***路由器故障
  6. 安装 SQL Server 2005 时出现性能计数器要求安装错误的解决办法
  7. ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题
  8. eclipse不能添加tomcat7的问题
  9. Spring Boot 学习系列(04)—分而治之,多module打包
  10. VMware中安装Centos 7