2016. 增量元素之间的最大差值

这篇博客探讨了如何解决寻找数列中两个数的最大差值问题,首先介绍了暴力解法,即通过两层循环实现,时间复杂度为O(n^2)。然后提出了一种优化方案,通过单层循环维护最小值,将时间复杂度降低到O(n)。这种方法在遍历数组的同时更新最大差值和当前最小值,从而提高了效率。相关题目包括买卖股票的最佳时机和最小栈等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目类型

求一个数列中,两个数的最大差值

2016. 增量元素之间的最大差值

在这里插入图片描述

其中 0 <= i < j < n 且 nums[i] < nums[j] 。
所以结果一定大于0,如果=<0.那么就直接返回-1;
注意:如果不存在满足要求的 i 和 j ,返回 -1 。这个条件

暴力解法

class Solution {
    public int maximumDifference(int[] nums) {
        //暴力解法和维护最小值解法
        int res = -1;//设置为最小值,如果不存在,就直接返回-1
        int n = nums.length;
        for(int i=0;i<n-1;i++){
             //i可以取到length-2
            for(int j=i+1;j<n;j++){
                 //j可以取到length-1
                //在满足条件的前提下,不断刷新res的最大值
                 //通过两层for循环,来找出最大的差值
                 //此时j肯定要>i的,因为每次双层的循环都是由,i=0和1-n之间的数的对比
                //nums[i]<nums[j]这个条件就已经限制了结果不可能为0
                 if(nums[i]<nums[j]&&nums[j]-nums[i]>res)
                    res =nums[j]-nums[i];
                   //res = Math.max( res,nums[j]-nums[i]);
            }
        }
        return res;
    }
}

单层循环维护最小值

上述方法,
计算任意两个元素之间的差值需要O(n^2)的复杂度

我们可以遍历数组的同时维护一个最小值,再计算差值时直接使用这个最小值计算,复杂度可以降为O(n)

class Solution {
    public int maximumDifference(int[] nums) {
        int n = nums.length;
        int val = (int)Math.pow(10,9);
        int res = -1;
        for(int i = 0;i<n;i++){
            res = Math.max(res,nums[i]-val);
            val = Math.min(val,nums[i]);
        }
        return (res>0? res:-1);
    }
}
class Solution {
    public int maximumDifference(int[] nums) {
        int n = nums.length;
        //保存数列中的最小值
        int val = (int)Math.pow(10,9);
        int res=-1;
        for(int i=0;i<n;i++){
            res = Math.max(res,nums[i]-val);
            val = Math.min(val,nums[i]);
        }
        //因为要求结果如果不大于0,那么就返回-1
        return res ==0?-1:res;
    }
}

相关题目

121. 买卖股票的最佳时机
155. 最小栈

https://leetcode-cn.com/problems/maximum-difference-between-increasing-elements/solution/2016-zeng-liang-yuan-su-zhi-jian-de-zui-p012g/

https://www.bilibili.com/video/BV1vi4y127fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值