Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 整数数组的最大和距离_Algorithm - Fatal编程技术网

Algorithm 整数数组的最大和距离

Algorithm 整数数组的最大和距离,algorithm,Algorithm,给定整数数组A,返回两个元素之间可能的最大和距离。对于i>j,总和距离定义为A[i]+A[j]+(i-j) 例如,使用A=[8,2,4,9,5,8,0,3,8,2]i=0和j=8时,最大和距离为24 O(n2)溶液是微不足道的。是否有任何O(n)解(其中n是数组的长度)?对于每个索引i,我们只需要知道一个索引,它最大化和A[i]+A[index]+(i-索引)=A[i]+i+(A[index]-index)。这意味着,我们只需要维护一个索引,这是A[index]-index的最大值 int索引=

给定整数数组A,返回两个元素之间可能的最大和距离。对于i>j,总和距离定义为
A[i]+A[j]+(i-j)

例如,使用
A=[8,2,4,9,5,8,0,3,8,2]
i=0和j=8时,最大和距离为24


O(n2)溶液是微不足道的。是否有任何O(n)解(其中n是数组的长度)?

对于每个索引i,我们只需要知道一个
索引
,它最大化和
A[i]+A[index]+(i-索引)=A[i]+i+(A[index]-index)
。这意味着,我们只需要维护一个
索引
,这是
A[index]-index
的最大值

int索引=0;
int结果=0;
对于(int i=1;iA[index]-index){
指数=i;
}
}
返回结果;
这是可能的:

  • 创建一个数组,并为每个i填充一个[i]+i

  • 创建另一个数组,并为每个j填充一个[j]-j

  • 获取具有最高I[maxI]和J[maxJ]的索引

  • 返回一个[maxI]+A[maxJ]+maxI-maxJ


好了,O(n)

太棒了……范……谢谢。 更具可读性的解决方案可能是

    int sumP = Integer.MIN_VALUE;
    int sumQ = Integer.MIN_VALUE;
    for(int i = 0; i < A.length; i++){
        sumP = Math.max(A[i] - i, sumP);
        sumQ = Math.max(A[i] + i, sumQ);
    }
    return sumP + sumQ;
int-seash=Integer.MIN\u值;
int sumQ=整数.MIN_值;
for(int i=0;i
这是以100%通过测试的最精确的解决方法`

var sumP = MIN_VALUE*2;
var sumQ = MIN_VALUE*2;
for(var i = 0; i < A.length; i++){
    sumP = Math.max(A[i] - i, sumP);
    sumQ = Math.max(A[i] + i, sumQ);
}
return sumP + sumQ;
var集水坑=最小值*2;
var sumQ=最小值*2;
对于(变量i=0;i
当然可以,因为
max(A[i]+i代表范围内的i(len(A))+max(A[j]-j代表范围内的j(len(A)))
。然后我看着你在绝对值或限制中编辑,
I
,然后我去找到重复项。@Davidisenstat这有什么区别吗?似乎如果I-j为负,有一个更好的解决方案,我和j交换。在这种情况下,我认为我们仍然可以将其标记为重复项,如果不是太有效的话t发现one@NiklasB.好吧,之前有人问过,但没有回答:。会把那一个复制到这个中。@NiklasB。还有一个版本的目标不那么容易分离——可能是
A[i]+A[j]-| i-j |
。我记得我回答过这个问题。举个例子,问题会更清楚。请你分享一个例子好吗?你能详细说明最后一步吗?不需要创建新的数组FWIW@Niklas是的,不需要两个数组,但它的可读性要高得多,如果在某一点上发现错误,您可以更好地调试它如果你真的不需要计算最大值约10万,你就不需要进行微优化来打乱你的代码了。@Sumeet请参阅编辑过的文章。只需遍历这些新数组,找到具有最大值的索引。此解决方案有两个主要缺点,第一,当只需要两个索引时,你需要两个数组来存储不必要的数据
maxI
maxJ
,其次,当
maxJ>maxI
时,此解决方案将给出错误的答案,因此对(maxI,maxJ)的答案应该是
A[maxI]+A[maxJ]当代码< > MaXi= Max J时,你不能处理这个问题。你不能认真考虑一个存储两个巨型数组的解决方案,而是一个追踪一个整数的解决方案。@ Stf取决于使用。不管怎样,它们基本上是相同的方法,对于10阶6的大数组来说,一个更有用,另一个则是下注。ter可调试。因为他没有提到他必须通过大量数组,所以我编写了可调试版本。@xXliolauXx有一个额外的数组并不意味着调试更好。我没有否决,但您的代码假设结果至少为0-我在问题说明中没有看到。非常好的答案,您能详细说明吗?抱歉,当我编辑时d、 我没有注意到它是用JavaScript编写的。我在考虑Java。而且没有办法重新编辑,因为它声称“编辑长度必须超过6个字符。”所以请将其反转为您拥有的版本。再次抱歉。