题目
给你一个下标从 开始的整数数组
,该数组的大小为
。
请你计算 能求得的 最大差值 ,其中
且
。
返回 最大差值 。如果不存在满足要求的 和
,返回
。
示例 1:
输入:nums = [7,1,5,4] 输出:4 解释:最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。 注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。
示例 2:
输入:nums = [9,4,3,2] 输出:-1 解释:不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。
力扣思路:前缀最小值
当我们固定 时,选择的下标
一定是满足
并且
最小的那个
。因此我们可以使用循环对
进行遍历,同时维护
的前缀最小值,记为
。这样一来:
- 如果
,那么就用
对答案进行更新;
- 否则,用
来更新前缀最小值
。
复杂度分析
时间复杂度: ,其中
是数组的长度,只需要遍历数组一次。
空间复杂度: 。
我的代码
class Solution {
public int maximumDifference(int[] nums) {
int n = nums.length;
int ans = -1;
int premin = nums[0];
for (int i = 1; i < n; ++i) {
if (nums[i] > premin) {
ans = Math.max(ans, nums[i] - premin);
} else {
premin = nums[i];
}
}
return ans;
}
}