为了账号安全,请及时绑定邮箱和手机立即绑定

打印 x 的最大值,其中 x = |(A[i] – A[j]) + (i – j)|

打印 x 的最大值,其中 x = |(A[i] – A[j]) + (i – j)|

慕标琳琳 2023-03-16 09:43:49
Directi面试中被问到的问题取一个输入数组,比如 A 并打印 x 的最大值,其中x = |(A[i] – A[j]) + (i – j)|Constraints:Max array size: 20000Time limit: 0.1s时间限制是这个问题的主要因素。这是设置者针对此问题的解决方案。'''THE BRUTE FORCE APPROACHdef maximum(arr):    res=0                n=len(arr)    for i in range (n):        for j in range(n):            res=max(res,abs(arr[i]-arr[j])+abs(i-j))    return res '''import sysdef maximum(arr):    max1=max2=-sys.maxsize-1    min1=min2=sys.maxsize    ans=0    n=len(arr)    for i in range(n):           max1=max(max1,arr[i]+i)        max2=max(max2,arr[i]-i)        min1=min(min1,arr[i]+i)        min2=min(min2,arr[i]-i)    ans=max(ans,max2-min2)        ans=max(ans,max1-min1)    return ans        但我尝试使用解决问题sortdef maximum(array):    n=len(array)    array.sort()    return (array[n-1]-array[0]) + (n-1)        if __name__=="__main__":    n=int(input())    array= list(map(int,input("\nEnter the numbers : ").strip().split()))[:n]    print(maximum(array))我的方法正确吗?优化了吗?提前致谢。
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

建议的首先排序和获取元素的答案是不正确的。以反例为例:[2,1,3]

  • 此问题的解决方案应产生 3:(3-1) + (2-1)或 (3-2) + (2-0)

  • 但是,建议的解决方案将产生 4:(3-1) + (2-0)


一个可能的(线性时间)解决方案:

让我们从一些代数开始,暂时去掉绝对值。

(A[i] – A[j]) + (i – j) = (A[i] + i) - (A[j] + j)

我们正在寻找最大价值,所以

  • 我们想最小化的价值(A[j] + j)

  • 我们想要最大化 的价值(A[i] + i)

  • 请注意,它们彼此完全独立。

您可以找到两个整数,一个使 最大化(A[i] + i),另一个使 最小化(A[j] + j)。找到这样的 2 个数字可以简单地在线性传递中完成。

以相反的方式重复(当(A[i] – A[j]) + (i – j)为负时):

  • 找到最小化的 i(A[i] + i)

  • 很好j,最大化(A[j] + j)

两者都在线性时间内完成,产生O(n)解决方案


查看完整回答
反对 回复 2023-03-16
?
呼唤远方

TA贡献1856条经验 获得超11个赞

排序会扰乱原始数组,并且元素在各自索引处的映射会丢失。所以从逻辑上讲,排序会导致错误的答案。

例如,正如@amit 在他的评论中正确描述的那样:

A = [2, 1, 3]

正确答案 = 3

建议的解决方案答案 = 4


查看完整回答
反对 回复 2023-03-16
  • 2 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信