Two methods: one is tricky the other use rolling array. Both O(n) space
In this case better go from bot to top
Rolling array: using inf
class Solution:def minimumTotal(self, triangle: List[List[int]]) -> int:n = len(triangle)result = [[float("inf")] * n for _ in range(2)]result[0][0] = triangle[0][0]for i in range(1,n):for j in range(i):result[i % 2][j] = min(result[(i-1) % 2][j-1], result[(i-1) % 2][j]) + triangle[i][j]print(j)print(result)return min(result[(n-1) % 2])
One array
class Solution:def minimumTotal(self, triangle: List[List[int]]) -> int:n = len(triangle)result = [0] * nresult[0] = triangle[0][0]for i in range(1,n):for j in range(i, -1, -1):if j == 0:result[j] = result[j] + triangle[i][j]elif j == i:result[j] = result[j-1] + triangle[i][j]else:result[j] = min(result[j-1], result[j]) + triangle[i][j]return min(result)
