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

      目录
      相关文章
      |
      3天前
      【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
      【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
      27 0
      |
      3天前
      PTA-二维数组中每行最大值和每行和
      该代码段读取一个3x3二维数组的输入,计算每行的最大值和元素和,并按照指定格式输出。给定输入示例为`3 6 5 9 8 2 1 4 5`,输出格式化后的结果为: ``` 3 6 5 6 14 9 8 2 9 19 1 4 5 5 10 ``` 代码首先使用`map(int, input().split())`将输入转换为整数列表,然后通过循环处理每行,计算每行的最大值(`max(s)`)和元素和(`sum(s)`),并使用`f-string`格式化输出,每个数据占4列。
      22 1
      |
      3天前
      nowcoder NC30 缺失的第一个正整数
      题目链接:  https://www.nowcoder.com/share/jump/819478881694767416272
      25 0
      |
      3天前
      |
      算法 C语言
      【牛客-算法】NC56 回文数字
      🚩 前言 🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中! 🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈
      33 0
      |
      3天前
      |
      存储 算法 Java
      【牛客-算法】NC57 反转数字
      题目描述 原题:NC57 反转数字 描述 给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果 1.只反转数字部分,符号位部分不反转
      22 0
      |
      7月前
      华为机试HJ58:输入n个整数,输出其中最小的k个
      华为机试HJ58:输入n个整数,输出其中最小的k个
      |
      7月前
      |
      容器
      华为机试HJ10:字符个数统计
      华为机试HJ10:字符个数统计
      |
      7月前
      |
      C++
      华为机试HJ2:计算某字母出现次数
      华为机试HJ2:计算某字母出现次数
      |
      7月前
      |
      Serverless
      华为机试HJ62:查找输入整数二进制中1的个数
      华为机试HJ62:查找输入整数二进制中1的个数
      |
      7月前
      华为机试HJ40:统计字符
      华为机试HJ40:统计字符