算法题目整理02
题目回忆:
已知有一个长度大于2 的数组A, 数组中有两个索引i 和 j ,0< i < j < A.length,
让我使用O(n)的时间复杂度来求A[j] - A[i] 的最大值。
思路解析:
记得之前做过一道盛水最多的容器:(来自于leetcode -11)
就很自然的想到了使用两个指针从两端遍历,从而计算最大面积的问题。
可这样遍历的都是一半(左半或者右半边)。
之后又想到两次从先向后的循环: 可这样时间复杂度就是O(n^2)了。
最后面试官给了自己思路,存储一个最大值 A[ j ] - A[ i ] 。之后遍历一遍这个数组,不断比较这个最大值,之后返回这个结果。
面试官脾气很好,逻辑也很清晰,自己实现思路中的漏洞,他在纸上比划一遍,想一下,就能说出我的错误来。
再然后,面试官让我使用代码实现。
之后,拿起手旁的纸,画图,写代码。吭哧吭哧,大概有六七分钟,才把这道题目使用代码实现。
面试完,再使用编辑器+ 数据测试。 大功告成!
下来我来展示一下代码的逻辑。
/**
* 从前向后遍历一个数组,A,已知A数组的全部元素为整数
* 已知这个数组index 值 0< i< j< A.length;
* 求A[j] - A[i] 的最大值
*
* 要求在O(n) 的时间复杂度内来完成
*/
public class Test01 {
public static int getMaxValue(int[] A){
// 此处指定n 为数组中的最小值,
// m为遍历到的最大值
int n = A[0];
int res = A[1]- A[0];
// 从头遍历到尾部 需要O(n) 的时间复杂度
for (int i = 0; i< A.length; ++i){
// 不断遍历数组,来获得数组中最小元素
if (n > A[i]){
n = A[i];
}
// 判断 :使用当前值与 之前 (数组中的最小值 n ) 的差 来 判断 res返回值的最大值
if (A[i] - n > res ){
res = A[i] - n;
}
}
return res ;
}
public static void main(String[] args) {
// 此处 nums 数组,即为传入的A 数组,可以使用多种数组来进行测试。
// int[] nums = {1, -3, -7, -12, 15}; // 输出 27
//int[] nums = {6, 8, 7, 0}; // 输出 2
int[] nums = {10, 5, 1}; // 输出0 ,即 数组中的所有元素倒序,没有 A[i] < A[j]的情况
int maxValue = getMaxValue(nums);
System.out.println(maxValue);
}
}