求|的最大值Ai-Aj | + | i-j |

时间:2019-08-03 12:52:55

标签: arrays logic absolute-value

单击here查看问题的根源

给出一个由'n'个整数组成的数组'A',需要找到以下表达式的最大值:

            |Ai - Aj| + |i - j|

其中Ai是数组的第i个位置的元素(0索引数组)

我只能想出一个O(n ^ 2)解决方案。  其中包括固定一个元素并遍历数组的其余部分,同时不断更新最大值。

解决上述问题的更快方法是什么?

1 个答案:

答案 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;
};