Algorithm 难以找到解决阵列问题的方法
请帮我想一想。Algorithm 难以找到解决阵列问题的方法,algorithm,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){ 如果(A==null | | A.length==0)返回新的int[]{-1,-1}; int start=0,end=A.length-1; int m1,m2;
下面是关于我们必须做什么的简短描述 输入:数组
输出:索引{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){
如果(A==null | | A.length==0)返回新的int[]{-1,-1};
int start=0,end=A.length-1;
int m1,m2;
int max=整数最大值;
while(启动最大值){
最大值=当前值;
m1=开始,m2=结束;
}
}
}
这是到目前为止我的代码
首先,我尝试用两个指针来解决这个问题
但问题是要使用两个指针(开始、结束),我们应该对数组进行排序,但是如果我们对数组进行排序,如何知道最后的索引
但是,如果数组未排序,我应该在开始、结束指针上执行什么操作?因此,让我们打破给定的条件
a[i] + a[j] + abs(i-j)
这可以通过两种方式写入:拆卸abs()
所以
所以您只需要创建两个数组,其中一个数组存储元素及其索引的和,而另一个数组则存在差异。而不仅仅是从这两个列表中选择最大元素,这将是最大值。这是密码
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)
a=[int(i)表示输入中的i().split()]
temp1=list()
temp2=list()
n=len(a)
对于范围(n)中的i:
temp1.追加(a[i]-i)
temp2.追加(a[i]+i)
maxi1=INT\u MIN
最大值2=整数最小值
对于范围(n)中的i:
如果maxi1
当列表的大小小于2时要小心。不使用2个列表来存储每个元素,我们只需修改for循环,就可以使用2个变量来存储两种情况下的最大值。这将把空间复杂度降低到O(1),在我们当前的解决方案中是O(n)。
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)
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)