Skip to main content
Tweeted twitter.com/StackCodeReview/status/912632568104804352
more examples
Source Link
Douglas
  • 869
  • 6
  • 12

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

Update:

Here's some sample inputs and outputs:

F( [10;4;5;0;8] ) = 8
F( [10;7;16;5;11;3;9;0] ) = 9 
F( [4;5;0;1;2;3;1;8] ) = 8
F( [12;21;10;20;9;18] ) = 10
F( [5;4] ) = -1

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

Update:

Here's some sample inputs and outputs:

F( [10;4;5;0;8] ) = 8
F( [10;7;16;5;11;3;9;0] ) = 9 
F( [4;5;0;1;2;3;1;8] ) = 8

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

Update:

Here's some sample inputs and outputs:

F( [10;4;5;0;8] ) = 8
F( [10;7;16;5;11;3;9;0] ) = 9 
F( [4;5;0;1;2;3;1;8] ) = 8
F( [12;21;10;20;9;18] ) = 10
F( [5;4] ) = -1
added 150 characters in body
Source Link
Douglas
  • 869
  • 6
  • 12

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

Update:

Here's some sample inputs and outputs:

F( [10;4;5;0;8] ) = 8
F( [10;7;16;5;11;3;9;0] ) = 9 
F( [4;5;0;1;2;3;1;8] ) = 8

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

I found this problem today and eventually came up with a solution. I'm interested in knowing other ways to solve it. You have a list of unsorted integers, and have to compute the greatest difference between list[j] - list[i] such that i < j.

Here's my code:

#include <stdio.h>

// remember the minimum to the left
static int _cached_max(int min, int n, int const* list)
{
  if(n < 1){
    return 0x80000000;
  }

  int max_index = 0;
  for(int i = 1; i < n; ++i){
    if(list[i] >= list[max_index]){
      max_index = i;
    }
  }
  
  // I know you can check this condition inside the loop above by keeping
  // some extra variables, keeping it here for readability
  for(int i = 0; i < max_index; ++i){
    if(list[i] < min){
      min = list[i];
    }
  }
  
  int this = list[max_index] - min;
  int next = _cached_max(min, n - max_index - 1, list + max_index + 1);
  
  return this > next ? this : next;
}

int custom_max(int n, int const* list)
{
  return _cached_max(list[0], n - 1, list + 1);
}

int main(int argc, char* argv[])
{
  int list[] = {12,21,10,20,9,18};
  int max = custom_max(sizeof list / sizeof list[0], list);
  
  printf("max = %d\n", max);

  return 0;
}

What is the optimal solution to this problem?

Update:

Here's some sample inputs and outputs:

F( [10;4;5;0;8] ) = 8
F( [10;7;16;5;11;3;9;0] ) = 9 
F( [4;5;0;1;2;3;1;8] ) = 8
edited tags
Link
200_success
  • 144.2k
  • 22
  • 188
  • 473
Source Link
Douglas
  • 869
  • 6
  • 12
Loading