题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。
#include <stdio.h>
int find_diff(int a[], int len)//动态规划,对于减数a[i],它的最大差值就是a[i]之前的最大值减去a[i],遍历一遍数组,找出这些最大值中的最大值,时间复杂度O(n)
{
if(a==NULL || len < 2)//至少要2个数
return 0;
int max = a[0];//最大值
int max_diff = a[0] - a[1];//最大差值
int i,curr_diff;
for(i=2;i<len;i++)
{
if(a[i-1] > max)//在i之前的最大值有两种可能:一种是i-1前的最大值,另一种可能就是i-1本身,找出二者的最大值作为i之前的最大值
max = a[i-1];
curr_diff = max - a[i];//记录当前a[i]的最大差值
if(curr_diff > max_diff)//更新整个数组的最大差值
max_diff = curr_diff;
}
return max_diff;
}
int main()
{
int a[] = {2,4,1,16,7,5,11,9};
int len = sizeof(a)/sizeof(int);
int i;
printf("数组值为:\n");
for(i=0;i<len;i++)
printf("%d\t",a[i]);
printf("\n");
int diff = find_diff(a,len);
printf("最大差值为:%d\n",diff);
return 0;
}