【题目】
给定一个长度为N(N>1)的整型数组arr,可以划分成左右两个部分,左部分为arr[0…k],右部分为arr[k+1…N],k可以取值的范围是[0…N-2]。求这么多划分方案中,左部分中的最大值减去右部分的最大值的绝对值中,最大是多少?
【基本思路】
方法一。
时间复杂度O(
N2
),空间复杂度O(1)。这是最笨的方法,从左到右遍历一次,对每一个位置都遍历一遍它的左边和右边。
#python3.5
def maxABS1(arr):
res = 0
for i in range(len(arr)-1): #重要
leftMax = -sys.maxsize
for j in range(i+1):
leftMax = max(arr[j], leftMax)
rightMax = -sys.maxsize
for k in range(i+1, len(arr)):
rightMax = max(arr[k], rightMax)
res = max(abs(rightMax-leftMax), res)
return res
方法二。
时间复杂度O(N),空间复杂度O(N)。使用两个辅助数组lHelp、rHelp。lHelp[i]表示arr[0…i]的最大值;rHelp[i]表示arr[i…N-1]的最大值。得到两个数组对位相减就是每一个位置左部分中的最大值减去右部分的最大值的绝对值。
def maxABS2(arr):
res = 0
lHelp = []
rHelp = []
lHelp.append(arr[0])
rHelp.append(arr[-1])
for i in range(1, len(arr)):
lHelp.append(arr[i] if arr[i] > lHelp[-1] else lHelp[-1])
for i in range(len(arr)-2, -1, -1):
rHelp.append(arr[i] if arr[i] > rHelp[-1] else rHelp[-1])
rHelp = rHelp[::-1]
for i in range(len(arr)):
res = max(abs(lHelp[i] - rHelp[i]), res)
return res
方法三。
时间复杂度O(N),空间复杂度O(1)。遍历一遍数组得到数组的最大值max,不管怎么分,max一定是左部分或者右部分最大的值。接下来只需要让另一个部分的最大值尽可能小就行,如何让另一个部分的最大值尽可能小?当只包含一个元素的时候就是尽量小的时候。
def maxABS3(arr):
maxNum = arr[0]
for i in range(1, len(arr)):
maxNum = max(arr[i], maxNum)
return max(abs(maxNum - arr[0]), abs(maxNum - arr[-1]))