LeetCode 329. Longest Increasing Path in a Matrix in F#
URL
leetcode.com/problems/longest-increasing-pa..
Code
github.com/syohex/dotnet-study/tree/master/..
open System
let longestIncreasingPath (matrix: int [,]) : int =
let steps = [ (-1, 0); (0, -1); (1, 0); (0, 1) ]
let rows = Array2D.length1 matrix
let cols = Array2D.length2 matrix
let validNextPositions row col (matrix: int [,]) =
steps
|> List.map (fun (r, c) -> row + r, col + c)
|> List.filter (fun (r, c) ->
r >= 0
&& r < rows
&& c >= 0
&& c < cols
&& matrix.[r, c] > matrix.[row, col])
let rec longestIncreasingPath' row col matrix (cache: Map<(int * int), int>) =
match Map.tryFind (row, col) cache with
| Some (v) -> v, cache
| None ->
let ret, cache' =
validNextPositions row col matrix
|> List.fold
(fun (ret, cache) (r, c) ->
let r, cache' = longestIncreasingPath' r c matrix cache
Math.Max(r, ret), cache')
(0, cache)
ret + 1, Map.add (row, col) (ret + 1) cache'
let points =
seq {
for i in 0 .. (rows - 1) do
for j in 0 .. (cols - 1) do
yield (i, j)
}
points
|> Seq.fold
(fun (acc, cache) (r, c) ->
let ret, cache' = longestIncreasingPath' r c matrix cache
Math.Max(acc, ret), cache')
(0, Map.empty)
|> fst