解法一:暴力解法
class Solution {
public int maximumDifference(int[] nums) {
int max = 0;
int ans = -1;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int num = nums[j] - nums[i];
max = Math.max(max, num);
}
ans = Math.max(max, ans);
}
return ans == 0 ? -1 : ans;
}
}
}
解法二:动态规划
class Solution {
public int maximumDifference(int[] nums) {
//动态规划dp[i]代表在i时,数组的最小值
int[] dp = new int[nums.length];
dp[0] = nums[0];
int ans = 0;
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.min(nums[i], dp[i - 1]);//求解dp[i]
ans = Math.max(ans, nums[i] - dp[i - 1]);//求最值
}
return ans == 0 ? -1 : ans;
}
}
解法三:前缀最小值(动态规划的优化)
class Solution {
public int maximumDifference(int[] nums) {
int premin = nums[0]; //代表前缀最小值
int ans = -1;
for(int i = 0;i < nums.length;i++) {
if(nums[i] > premin) {
ans = Math.max(ans,nums[i]-premin);
}else { //更新前缀最小值
premin = nums[i];
}
}
return ans;
}
}