nowcoder NC236题 最大差值

简介: 【1月更文挑战第2天】

题目跳转imagehttps://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId=128&tqId=33768&ru=/exam/oj


 题目描述:

有一个长为 n 的数组 A ,求满足 0 ≤ a ≤ b < n 的 A[b] - A[a] 的最大值。

给定数组 A 及它的大小 n ,请返回最大差值。

数据范围: image ,数组中的值满足 image

示例1

输入:[5,1],2

复制返回值:0

示例2

输入:[5,6],2

复制返回值:1

题干解析:

从题目中我们可以得出以下几点结论

    1. 从给定的 数组A 中求出最大差值
    2. 数组的顺序不能改变;
    3. 结果必须大于等于0
    4. 必须是后面的数前面的数

     暴力求解:

    读完题目后我们可以很容易的写出暴力解法:

    利用两个for()循环把每一个数都试一遍然后返回其中的最大值

    代码展示: 

    public int getDis (int[] A, int n) {
            int max = 0;
            for (int i = 0; i < n; i++){
                for (int j = i+1; j < n; j++){
                    if (A[j] - A[i] > max){
                        max = A[j] - A[i];
                    }
                }
            }
     
            return max;
        }

    image.gif

    但是当我们写完之后我们自己也一定会觉得这段代码的时间复杂度太大了可能会挂,运行之后也确实挂了。


    image.png

    优化:

    根据题目描述我们可以先简单的画一张折线图每一个点都是一个数据:

    image.png

    image.png

    据图可知我们需要返回的是 b1,b2,b3,b4,b5,b6 中的最大值

    此时我们我们就可以:

      1. 定义一个 max 变量用来存储已遍历过的数最大差值;
      2. 定义一个变量 a 用来存储已遍历过的数中的最小值;
      3. 用一个 for()循环 来对 数组A 进行遍历,然后不断更新 max 和 a 的值。

      代码展示: 

      public int getDis (int[] A, int n) {
              int max = 0;
              int a = 0;
              for (int i = 1; i < n; i++){
                  if (A[i] - A[a] > max){
                      max = A[i] - A[a];
                  }
                  if (A[i] < A[a]){
                      a = i;
                  }
              }
              return max;
          }

      image.gif

      此时代码的时间复杂度被压缩到了O(n),所以只要思路正确就一定会通过。

      image.png

      目录
      相关文章
      |
      C语言 开发者
      【C语言】数学函数详解
      在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
      578 6
      |
      网络协议 Java 应用服务中间件
      深入浅出Tomcat网络通信的高并发处理机制
      【10月更文挑战第3天】本文详细解析了Tomcat在处理高并发网络请求时的机制,重点关注了其三种不同的IO模型:NioEndPoint、Nio2EndPoint 和 AprEndPoint。NioEndPoint 采用多路复用模型,通过 Acceptor 接收连接、Poller 监听事件及 Executor 处理请求;Nio2EndPoint 则使用 AIO 异步模型,通过回调函数处理连接和数据就绪事件;AprEndPoint 通过 JNI 调用本地库实现高性能,但已在 Tomcat 10 中弃用
      深入浅出Tomcat网络通信的高并发处理机制
      |
      设计模式 安全 编译器
      【C++ 异常】C++异常处理:掌握高效、健壮代码的秘密武器
      【C++ 异常】C++异常处理:掌握高效、健壮代码的秘密武器
      481 1
      |
      机器学习/深度学习 算法
      【OpenVI—视觉生产系列之视频插帧实战篇】几行代码,尽享流畅丝滑的视频观感
      随着网络电视、手机等新媒体领域的快速发展,用户对于观看视频质量的要求也越来越高。当前市面上所广为传播的视频帧率大多仍然处于20~30fps,已经无法满足用户对于高清、流畅的体验追求。而视频插帧算法,能够有效实现多倍率的帧率提升,有效消除低帧率视频的卡顿感,让视频变得丝滑流畅。配合其它的视频增强算法,更是能够让低质量视频焕然一新,让观众享受到极致的播放和观看体验。
      1178 0
      【OpenVI—视觉生产系列之视频插帧实战篇】几行代码,尽享流畅丝滑的视频观感
      |
      存储 SQL 数据采集
      IoT设备数据的存储、解析和价值挖掘实践
      本实践以一个道路交通场景下设备运营管理的真实需求为背景来介绍如何使用物联网平台的数据服务完成对设备数据的存储、备份、预处理和深度分析,以达到企业经营提效的效果。
      1311 0
      IoT设备数据的存储、解析和价值挖掘实践
      |
      监控 算法 前端开发
      彻底认识「JIT编译器的运行原理」|Java 开发实战
      彻底认识「JIT编译器的运行原理」|Java 开发实战
      749 0
      彻底认识「JIT编译器的运行原理」|Java 开发实战
      |
      人工智能 自动驾驶 大数据
      官宣!我们和长城汽车在一起了
      官宣!我们和长城汽车在一起了
      486 0
      |
      存储 移动开发 小程序
      DingTalk「开发者说」|钉钉小程序开发实践
      摘要:DingTalk「开发者说」是专为钉钉开发者打造的栏目,分享钉应用开发的实战技巧、技术架构、解决方案,致力于成为钉钉与开发者的连接桥梁。本篇分享主要内容包含移动端Web的特点,钉钉小程序的优势,钉钉小程序开发原则,开发中常见的问题,以及钉钉小程序未来规划。 分享人:宵何,钉钉小程序开发工具及研发链路技术负责人
      73355 5
      DingTalk「开发者说」|钉钉小程序开发实践
      |
      缓存 关系型数据库 MySQL
      Docker下载加速
      Docker下载加速

      热门文章

      最新文章