题目描述
有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。
给定数组A及它的大小n,请返回最大差值。
测试样例:
[10,5],2
返回:0
本来是想用map来储存值,键的,结果map是不能重复的,所以用了别的方法,
暴力解法:
import java.util.*;
public class LongestDistance {
public int getDis(int[] A, int n) {
// write code here
int max = 0;
for (int i = 0; i < A.length; i++) {
for (int j = i; j < A.length; j++) {
if(A[j]-A[i]>max)max = (A[j]-A[i]);
}
}
return max;
}
}
因为看到这道题在牛客网的贪心分类是热度最高的,以为会比较经典。
看看优化解法:时间复杂度只有O(n)
import java.util.*;
public class LongestDistance {
public int getDis(int[] A, int n) {
// write code here
int max = 0;
if(n>1) {
int min = A[0];
for (int i = 0; i < A.length; i++) {
if(A[i]-min>max)max = A[i]-min;
if(min>A[i])min = A[i];
}
}
return max;
}
}
心得:这个最优解的做法,其实就是充分利用时间资源。在一个循环里,某个参数如果是根据该循环的改变而改变的,就可以在循环中直接使用这个参数。而两个for循环就是直接把数组中的所有数相减,并没有提前把最小值数据化。
这是一种很经典的减少时间复杂度的做法,我在很多的很好的解法中看到被用,我觉得大家都可以学习的,这种方法就是在for循环或while循环中,对比数据得到可得到符合条件的当前最小值或最大值,并利用当前的参数对数据的结果进行帮助计算的,可以有效的减少时间复杂度。