问题
找到两个数组元素之间的最大差异,使大的元素出现在小的元素之后。
蛮力方法
利用两个循环。在外循环中逐一挑选项目,在内循环中计算所选元素与数组中其他所有元素的差值,并将该差值与目前确定的最大差值进行比较。
这需要O(N``2``) 时间。我们能做得更好吗?让我们来看看!
高效的方法
在这个技术中,我们不是取所选元素和其他每个元素之间的差值,而是取所选元素和迄今为止发现的最小元素之间的差值。因此,我们必须保持两方面的跟踪。
- 到目前为止发现的最大差异。
- 迄今为止查看的最小的元素数量。
这种方法只需要O(N)时间和O(1)空间。
C 编程
#include<stdio.h>
int solve(int arr[], int n)
{
int ans = arr[1] - arr[0]; //keep track of answer
int minElement = arr[0]; //keep track of minimum element
int i;
for(i = 1; i < n; i++)
{
if (arr[i] - minElement > ans) //update answer
ans = arr[i] - minElement;
if (arr[i] < minElement)
minElement = arr[i];
}
return ans;
}
void main(){
int a[]={1, 2, 3, 4, 7, 3, 5};
int n = sizeof(a)/sizeof(a[0]);
printf("%d",solve(a, n));
}
输出
6
C++编程
#include <bits/stdc++.h>
using namespace std;
int solve(int arr[], int n)
{
// max difference
int ans = arr[1] - arr[0];
// minimum element
int minElement = arr[0];
for(int i = 1; i < n; i++)
{
if (arr[i] - minElement > ans)
ans = arr[i] - minElement;
if (arr[i] < minElement)
minElement = arr[i];
}
return ans;
}
int main(){
int a[]={1, 2, 3, 4, 7, 3, 5};
int n = sizeof(a)/sizeof(a[0]);
cout<<solve(a, n);
}
输出
6
Python编程
def solve(arr, n):
ans = arr[1] - arr[0] #keep track of difference
minElement = arr[0] #keep track of minimum element
for i in range( 1, n ):
if (arr[i] - minElement > ans): #update answer
ans = arr[i] - minElement
if (arr[i] < minElement):
minElement = arr[i]
return ans
l = [1, 2, 3, 4, 7, 3, 5]
n = len(l)
print(solve(l,n))
输出
6