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

      目录
      相关文章
      |
      5月前
      |
      容器
      【题解】NowCoder NC313 两个数组的交集
      【题解】NowCoder NC313 两个数组的交集
      37 6
      |
      6月前
      nowcoder NC30 缺失的第一个正整数
      题目链接:  https://www.nowcoder.com/share/jump/819478881694767416272
      44 0
      |
      6月前
      |
      算法 C语言
      【牛客-算法】NC56 回文数字
      🚩 前言 🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中! 🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈
      57 0
      |
      容器
      华为机试HJ60:查找组成一个偶数最接近的两个素数
      华为机试HJ60:查找组成一个偶数最接近的两个素数
      华为机试HJ58:输入n个整数,输出其中最小的k个
      华为机试HJ58:输入n个整数,输出其中最小的k个
      |
      容器
      华为机试HJ10:字符个数统计
      华为机试HJ10:字符个数统计
      华为机试HJ84:统计大写字母个数
      华为机试HJ84:统计大写字母个数
      华为机试HJ73:计算日期到天数转换
      华为机试HJ73:计算日期到天数转换
      |
      Serverless
      华为机试HJ62:查找输入整数二进制中1的个数
      华为机试HJ62:查找输入整数二进制中1的个数