如何求数组中数对差最大

今天看到了一个问题,如何求数组中数对差最大。数对差是指一个数组中某两个元素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))

运行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值