找不到解决阵列问题的方法

时间:2019-08-11 02:49:52

标签: algorithm

请帮助我了解任何想法。
下面是有关我们要做的事情的简短描述。

  

输入:数组
   输出:索引{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;
        }
     }
 }

这是我到目前为止的编码。

首先,我尝试使用两个指针解决此问题 但是问题是
要使用两个指针(开始,结束),我们应该对数组进行排序,但是如果对数组进行排序,那么如何知道最后的索引呢?

但是如果数组未排序,我应该在开始,结束指针处做什么?

1 个答案:

答案 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时请小心。