Solving this Python implementation for Stock Gains I wanted to ask for a code review for the following interview question:


  Problem: Max Gain
  
  Given an list of integers, write a method - max_gain - that returns the maximum gain. Maximum Gain is defined as the maximum difference between 2 elements in a list such that the larger element appears after the smaller element. If no gain is possible, return 0.


Example:

max_gain([100,40,20,10]) ==&gt; 0
max_gain([0,50,10,100,30]) ==&gt; 100


Solution

def max_gain(input_list):
    if len(input_list) &lt; 2:
        return 0
    a = input_list[0]
    max_val = 0
    for i in input_list[1:]:
        max_val = max(max_val, i-a)
        a = min(a, i)
    return max_val
As a variable name, i has a connotation of being an index, rather than a value, of a list.  I would expect it to be used in contexts more like for i, value in enumerate(values).

Making the slice input_list[1:] would involve duplicating most of the list. I would use an iterator to avoid doing that, and also to simplify the handling of the special case.

With a few improvements in naming…

def max_gain(input_list):
    prices = iter(input_list)
    best_buy = next(prices, 0)
    profit = 0
    for price in prices:
        profit = max(profit, price - best_buy)
        best_buy = min(best_buy, price)
    return profit