Algorithm 整数数组的最大和距离
给定整数数组A,返回两个元素之间可能的最大和距离。对于i>j,总和距离定义为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]+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个字符。”所以请将其反转为您拥有的版本。再次抱歉。