解题思路

沿着题目思路写,首先构建第一轮的元素,后面每一轮的元素由上一轮元素决定,于是构建Map用于存储上一轮的数据方便取值(取不到的数据为0,符合题意)

该题属于动态规划里面明确指出前后关系的了,有些题需要自己去挖掘这个前后关系~

代码

-spec generate(NumRows :: integer()) -> [[integer()]].
generate(NumRows) ->
    do_generate(1, _LastMap = #{}, _Args = #{rows => NumRows, nums => []}).

do_generate(1, _, Args) ->
    do_generate(2, #{1 => 1}, Args#{nums := [[1]]});
do_generate(N, LastMap, Args = #{rows := NumRows, nums := Nums}) when N =< NumRows ->
    Fun = fun(Index, Acc) ->
            L = maps:get(Index - 1, LastMap, 0),
            R = maps:get(Index, LastMap, 0),
            Num = L + R,
            [Num | Acc]
    end,
    SeqNums = lists:seq(1, N),
    RowNums = lists:foldl(Fun, [], SeqNums),
    Map = maps:from_list(lists:zip(SeqNums, RowNums)),
    NewRowNums = lists:reverse(RowNums),
    do_generate(N + 1, Map, Args#{nums := [NewRowNums | Nums]});
do_generate(_, _, _Args = #{nums := Nums}) ->
    lists:reverse(Nums).