This problem basically involves finding the largest and smallest values.
Heres a O(n) solution
Heres the hand math of how this works.
You get the values one by one
1 2 3 1
and you know the indexes of these values
0 1 2 3
if you add them together, you get
1 3 5 4
if you keep track of the lowest sum at the lowest index and highest sums at the highest index, those points will be the values you need to use
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);
- Edit
I organized the array values with this simple struct
struct ArrayVal {
int index;
int value;
int total;
};
- Edit 2
Per @ViduhVerma's keen eyes, I make the following edit.
instead of summing the indexes, subtract them.
Example 1:
input numbers: 10 5 15 18 11 4
input indexes: 0 1 2 3 4 5
resulting subs: 10 4 13 15 7 -1
max - min = 16
Example 2:
input numbers: 1 2 3 1
input indexes: 0 1 2 3
resulting subs: 1 1 1 -2
max - min = 3