Skip to content

Instantly share code, notes, and snippets.

@wetmore
Last active November 8, 2015 08:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wetmore/396c9e5c9f55f98e25db to your computer and use it in GitHub Desktop.
Save wetmore/396c9e5c9f55f98e25db to your computer and use it in GitHub Desktop.
Find the maximum profit from buying and selling once.
data StockState = StockState { hi :: Int, lo :: Int, lowest :: Int }
deriving Show
solve xs = (hi st) - (lo st)
where
st = solve' xs
solve' [] = StockState 0 0 0
solve' (x:xs) = foldl go (StockState 0 0 x) xs
where
go st price = let
lowest' = min price (lowest st)
in if price - (lowest st) > (hi st) - (lo st)
then StockState price (lowest st) lowest'
else StockState (hi st) (lo st) lowest'
-- examples
solve' [10, 30, 42, 15, 20, 50, 10, 25] --> StockState {hi = 50, lo = 10, lowest = 10}
solve [10, 30, 42, 15, 20, 50, 10, 25] --> 40
solve' [30, 42, 15, 20, 50, 10, 25] --> StockState {hi = 50, lo = 15, lowest = 10}
solve [30, 42, 15, 20, 50, 10, 25] --> 35
solve' [40, 30, 20, 10] --> StockState {hi = 0, lo = 0, lowest = 10}
solve [40, 30, 20, 10] --> 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment