其他题目---最大的leftMax与rightMax之差的绝对值

【题目】

  给定一个长度为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]))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值