🚩传送门:牛客题目
力扣题目

题目

给你一个下标从 [NC]236. 最大差值/增量元素之间的最大差值 - 图1 开始的整数数组 [NC]236. 最大差值/增量元素之间的最大差值 - 图2 ,该数组的大小为 [NC]236. 最大差值/增量元素之间的最大差值 - 图3

请你计算 [NC]236. 最大差值/增量元素之间的最大差值 - 图4 能求得的 最大差值 ,其中 [NC]236. 最大差值/增量元素之间的最大差值 - 图5[NC]236. 最大差值/增量元素之间的最大差值 - 图6

返回 最大差值 。如果不存在满足要求的 [NC]236. 最大差值/增量元素之间的最大差值 - 图7[NC]236. 最大差值/增量元素之间的最大差值 - 图8 ,返回 [NC]236. 最大差值/增量元素之间的最大差值 - 图9

示例 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 组合。

力扣思路:前缀最小值

当我们固定 [NC]236. 最大差值/增量元素之间的最大差值 - 图10 时,选择的下标 [NC]236. 最大差值/增量元素之间的最大差值 - 图11 一定是满足 [NC]236. 最大差值/增量元素之间的最大差值 - 图12 并且 [NC]236. 最大差值/增量元素之间的最大差值 - 图13 最小的那个 [NC]236. 最大差值/增量元素之间的最大差值 - 图14。因此我们可以使用循环对 [NC]236. 最大差值/增量元素之间的最大差值 - 图15 进行遍历,同时维护 [NC]236. 最大差值/增量元素之间的最大差值 - 图16 的前缀最小值,记为 [NC]236. 最大差值/增量元素之间的最大差值 - 图17。这样一来:

  • 如果 [NC]236. 最大差值/增量元素之间的最大差值 - 图18,那么就用 [NC]236. 最大差值/增量元素之间的最大差值 - 图19 对答案进行更新;
  • 否则,用 [NC]236. 最大差值/增量元素之间的最大差值 - 图20 来更新前缀最小值 [NC]236. 最大差值/增量元素之间的最大差值 - 图21

复杂度分析

时间复杂度: [NC]236. 最大差值/增量元素之间的最大差值 - 图22 ,其中 [NC]236. 最大差值/增量元素之间的最大差值 - 图23 是数组的长度,只需要遍历数组一次。

空间复杂度:[NC]236. 最大差值/增量元素之间的最大差值 - 图24

我的代码

  1. class Solution {
  2. public int maximumDifference(int[] nums) {
  3. int n = nums.length;
  4. int ans = -1;
  5. int premin = nums[0];
  6. for (int i = 1; i < n; ++i) {
  7. if (nums[i] > premin) {
  8. ans = Math.max(ans, nums[i] - premin);
  9. } else {
  10. premin = nums[i];
  11. }
  12. }
  13. return ans;
  14. }
  15. }