今天看到了一个问题,如何求数组中数对差最大。数对差是指一个数组中某两个元素a和b(并且a排在b的前面),a减去b所得到的差值。
思路:
首先求出数组中任意一对相邻的数据之间的差值,得到一个新的数组。如果某两个数据之间的数对差最大,也就是说这两个数据之间的差值最大。假设这两个数据的位置是i和j,那么这两个位置之间的数据是a[i],a[i+1],a[i+2]......,a[j-1],a[j]。那么a[i]-a[j]=(a[i]-a[i+1])+(a[i+1]-a[i+2])+......(a[j-1]-a[j]),括号中的数据是相邻数据的差值,都已经在前面求出来了。然后这个问题就转化为了求数组中连续的子数组和最大的问题,这个问题可以通过动态规划问题求出来。
源代码如下:Python编写
#coding:utf-8
import random
def Max(firstNum,secondNum):
if firstNum>=secondNum:
return firstNum
else:
return secondNum
def Count(array):
gapArray=[]
length=len(array)
#遍历一遍记录相邻两个之间的gap
for i in xrange(length-1):
gap=array[i]-array[i+1]
gapArray.append(gap)
#转化为子集合最大和问题
max=-((1<<32)-1)
sum=0
for i in xrange(len(gapArray)):
sum+=gapArray[i]
max=Max(max,sum)
if sum<0:
sum=0
return max
array=[]
for i in xrange(20):
array.append(random.randint(0,50))
print array
print "max gap:"+str(Count(array))
运行结果: