如何利用C++、C、Python求两个元素之间的最大差异,使较大的元素出现在较小的数字之后

187 阅读1分钟

问题

找到两个数组元素之间的最大差异,使大的元素出现在小的元素之后。

蛮力方法

利用两个循环。在外循环中逐一挑选项目,在内循环中计算所选元素与数组中其他所有元素的差值,并将该差值与目前确定的最大差值进行比较。

这需要O(N``2``) 时间。我们能做得更好吗?让我们来看看!

高效的方法

在这个技术中,我们不是取所选元素和其他每个元素之间的差值,而是取所选元素和迄今为止发现的最小元素之间的差值。因此,我们必须保持两方面的跟踪。

  1. 到目前为止发现的最大差异。
  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