题目类型
求一个数列中,两个数的最大差值
其中 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;
}
}