Welcome to Subscribe On Youtube
2016. Maximum Difference Between Increasing Elements
Description
Given a 0-indexed integer array nums
of size n
, find the maximum difference between nums[i]
and nums[j]
(i.e., nums[j] - nums[i]
), such that 0 <= i < j < n
and nums[i] < nums[j]
.
Return the maximum difference. If no such i
and j
exists, return -1
.
Example 1:
Input: nums = [7,1,5,4] Output: 4 Explanation: The maximum difference occurs with i = 1 and j = 2, nums[j] - nums[i] = 5 - 1 = 4. Note that with i = 1 and j = 0, the difference nums[j] - nums[i] = 7 - 1 = 6, but i > j, so it is not valid.
Example 2:
Input: nums = [9,4,3,2] Output: -1 Explanation: There is no i and j such that i < j and nums[i] < nums[j].
Example 3:
Input: nums = [1,5,2,10] Output: 9 Explanation: The maximum difference occurs with i = 0 and j = 3, nums[j] - nums[i] = 10 - 1 = 9.
Constraints:
n == nums.length
2 <= n <= 1000
1 <= nums[i] <= 109
Solutions
Solution 1: Maintaining Prefix Minimum
We use the variable $mi$ to represent the minimum value of the elements we have traversed so far, and the variable $ans$ to represent the maximum difference. Initially, $mi$ is set to $+\infty$, and $ans$ is set to $-1$.
We traverse the array. For the current element $x$, if $x > mi$, then we update $ans$ to be $max(ans, x - mi)$, otherwise we update $mi = x$.
After the traversal, we return $ans$.
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
-
class Solution { public int maximumDifference(int[] nums) { int mi = 1 << 30; int ans = -1; for (int x : nums) { if (x > mi) { ans = Math.max(ans, x - mi); } else { mi = x; } } return ans; } }
-
class Solution { public: int maximumDifference(vector<int>& nums) { int mi = 1 << 30; int ans = -1; for (int& x : nums) { if (x > mi) { ans = max(ans, x - mi); } else { mi = x; } } return ans; } };
-
class Solution: def maximumDifference(self, nums: List[int]) -> int: mi = inf ans = -1 for x in nums: if x > mi: ans = max(ans, x - mi) else: mi = x return ans
-
func maximumDifference(nums []int) int { mi := 1 << 30 ans := -1 for _, x := range nums { if mi < x { ans = max(ans, x-mi) } else { mi = x } } return ans }
-
function maximumDifference(nums: number[]): number { const n = nums.length; let min = nums[0]; let res = -1; for (let i = 1; i < n; i++) { res = Math.max(res, nums[i] - min); min = Math.min(min, nums[i]); } return res === 0 ? -1 : res; }
-
/** * @param {number[]} nums * @return {number} */ var maximumDifference = function (nums) { let mi = 1 << 30; let ans = -1; for (const x of nums) { if (mi < x) { ans = Math.max(ans, x - mi); } else { mi = x; } } return ans; };
-
impl Solution { pub fn maximum_difference(nums: Vec<i32>) -> i32 { let mut min = nums[0]; let mut res = -1; for i in 1..nums.len() { res = res.max(nums[i] - min); min = min.min(nums[i]); } match res { 0 => -1, _ => res, } } }