请帮助我了解任何想法。
下面是有关我们要做的事情的简短描述。
输入:数组
输出:索引{i,j}(允许i = j),最大值 上诉上诉= A [i] + A [j] + abs(i-j)示例
输入:A = {1,3,-1}
输出:{1,1}
申诉= A [1] + A [1] + abs(1-1)= 3 + 3+ 0 = 6
public int[] maxAppealPair(int[] A){
if(A==null || A.length==0) return new int[] {-1,-1};
int start=0, end=A.length-1;
int m1, m2;
int max = Integer.MAX_VALUE;
while(start <= end){
int curr = A[start] + A[end] + Math.abs(start-end);
if(curr > max){
max = curr;
m1 = start, m2 = end;
}
}
}
这是我到目前为止的编码。
首先,我尝试使用两个指针解决此问题
但是问题是
要使用两个指针(开始,结束),我们应该对数组进行排序,但是如果对数组进行排序,那么如何知道最后的索引呢?
但是如果数组未排序,我应该在开始,结束指针处做什么?
答案 0 :(得分:2)
所以让我们打破您的给定条件。
a[i] + a[j] + abs(i-j)
这可以通过2种方式删除abs()来写成
a[i] + a[j] + i - j
a[i] + a[j] - i + j
如此
(a[i] + i) + ( a[j] - j) and
(a[i] - i) + (a[j] + j)
因此,您只需要制作2个数组,其中一个存储元素总和及其索引,而另一个则有区别。比从那两个列表中选择最大元素,那将是最大值。这是代码
a = [int(i) for i in input().split()]
temp1 = list()
temp2 = list()
n = len(a)
for i in range(n):
temp1.append(a[i]-i)
temp2.append(a[i]+i)
maxi1 = INT_MIN
maxi2 = INT_MIN
for i in range(n):
if maxi1 < temp1[i]:
maxi1 = temp1[i]
index1 = i
if maxi2 < temp2[i]:
maxi2 = temp2[i]
index2 = i
print(index1,index2)
当列表的大小小于2时请小心。