单击here查看问题的根源
给出一个由'n'个整数组成的数组'A',需要找到以下表达式的最大值:
|Ai - Aj| + |i - j|
其中Ai是数组的第i个位置的元素(0索引数组)
我只能想出一个O(n ^ 2)解决方案。 其中包括固定一个元素并遍历数组的其余部分,同时不断更新最大值。
解决上述问题的更快方法是什么?
答案 0 :(得分:0)
此问题基本上涉及找到最大值和最小值。 这是O(n)解决方案
这是如何工作的。
您一一得到了值
1 2 3 1
您知道这些值的索引
0 1 2 3
如果将它们加在一起,就会得到
1 3 5 4
如果您跟踪最低索引处的最低金额和最高索引处的最高金额,那么这些点将是您需要使用的值
for(int i = 0; i < N; i++)
{
int value = 0;
scanf("%d", value);
if(value + i < min.total) // < gets the lowest indexed value
{
min.total = value + i;
min.value = value;
min.index = i;
}
if(value + i >= max.total) // >= gets the highest indexed value
{
max.total = value + i;
max.value = value;
max.index = i;
}
}
int output = abs(max.value - min.value) + abs(max.index - min.index);
-修改 我用这个简单的结构组织了数组值
struct ArrayVal {
int index;
int value;
int total;
};