From b61e631b2ee73ffa2080719963101f2d80690d44 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Thu, 25 Sep 2025 07:04:54 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.0120 --- solution/0100-0199/0120.Triangle/README.md | 119 ++++++++--------- solution/0100-0199/0120.Triangle/README_EN.md | 121 ++++++++---------- solution/0100-0199/0120.Triangle/Solution.cpp | 11 +- solution/0100-0199/0120.Triangle/Solution.go | 11 +- .../0100-0199/0120.Triangle/Solution.java | 8 +- solution/0100-0199/0120.Triangle/Solution.rs | 6 +- solution/0100-0199/0120.Triangle/Solution.ts | 8 +- .../0100-0199/0120.Triangle/Solution2.cpp | 10 +- solution/0100-0199/0120.Triangle/Solution2.go | 10 +- .../0100-0199/0120.Triangle/Solution2.java | 12 +- solution/0100-0199/0120.Triangle/Solution2.rs | 9 +- solution/0100-0199/0120.Triangle/Solution2.ts | 8 +- solution/0100-0199/0120.Triangle/Solution3.py | 9 -- 13 files changed, 154 insertions(+), 188 deletions(-) delete mode 100644 solution/0100-0199/0120.Triangle/Solution3.py diff --git a/solution/0100-0199/0120.Triangle/README.md b/solution/0100-0199/0120.Triangle/README.md index 732aadca5a4fd..e02a03834483a 100644 --- a/solution/0100-0199/0120.Triangle/README.md +++ b/solution/0100-0199/0120.Triangle/README.md @@ -73,17 +73,11 @@ tags: 我们定义 $f[i][j]$ 表示从三角形底部走到位置 $(i, j)$ 的最小路径和。这里的位置 $(i, j)$ 指的是三角形中第 $i$ 行第 $j$ 列(均从 $0$ 开始编号)的位置。那么我们有如下的状态转移方程: $$ -f[i][j] = \min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j] +f[i][j] = \min(f[i + 1][j], f[i + 1][j + 1]) + \text{triangle}[i][j] $$ 答案即为 $f[0][0]$。 -我们注意到,状态 $f[i][j]$ 仅与状态 $f[i + 1][j]$ 和状态 $f[i + 1][j + 1]$ 有关,因此我们可以使用一维数组代替二维数组,将空间复杂度从 $O(n^2)$ 降低至 $O(n)$。 - -时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 是三角形的行数。 - -更进一步,我们还可以直接复用 $triangle$ 作为 $f$ 数组,这样就无需再额外创建 $f$ 数组,空间复杂度降低至 $O(1)$。 - #### Python3 @@ -105,13 +99,13 @@ class Solution: class Solution { public int minimumTotal(List> triangle) { int n = triangle.size(); - int[] f = new int[n + 1]; + int[][] f = new int[n + 1][n + 1]; for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle.get(i).get(j); } } - return f[0]; + return f[0][0]; } } ``` @@ -123,14 +117,13 @@ class Solution { public: int minimumTotal(vector>& triangle) { int n = triangle.size(); - int f[n + 1]; - memset(f, 0, sizeof(f)); - for (int i = n - 1; ~i; --i) { + vector> f(n + 1, vector(n + 1, 0)); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } }; ``` @@ -140,13 +133,16 @@ public: ```go func minimumTotal(triangle [][]int) int { n := len(triangle) - f := make([]int, n+1) + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, n+1) + } for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - f[j] = min(f[j], f[j+1]) + triangle[i][j] + f[i][j] = min(f[i+1][j], f[i+1][j+1]) + triangle[i][j] } } - return f[0] + return f[0][0] } ``` @@ -155,13 +151,13 @@ func minimumTotal(triangle [][]int) int { ```ts function minimumTotal(triangle: number[][]): number { const n = triangle.length; - const f: number[] = Array(n + 1).fill(0); - for (let i = n - 1; ~i; --i) { + const f: number[][] = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0)); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } ``` @@ -171,13 +167,13 @@ function minimumTotal(triangle: number[][]): number { impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { let n = triangle.len(); - let mut f = vec![0; n + 1]; + let mut f = vec![vec![0; n + 1]; n + 1]; for i in (0..n).rev() { for j in 0..=i { - f[j] = f[j].min(f[j + 1]) + triangle[i][j]; + f[i][j] = f[i + 1][j].min(f[i + 1][j + 1]) + triangle[i][j]; } } - f[0] + f[0][0] } } ``` @@ -188,7 +184,11 @@ impl Solution { -### 方法二 +### 方法二:动态规划(空间优化) + +我们注意到,状态 $f[i][j]$ 仅与状态 $f[i + 1][j]$ 和状态 $f[i + 1][j + 1]$ 有关,因此我们可以使用一维数组代替二维数组,将空间复杂度从 $O(n^2)$ 降低至 $O(n)$。 + +时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 是三角形的行数。 @@ -210,14 +210,14 @@ class Solution: ```java class Solution { public int minimumTotal(List> triangle) { - for (int i = triangle.size() - 2; i >= 0; --i) { + int n = triangle.size(); + int[] f = new int[n + 1]; + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - int x = triangle.get(i).get(j); - int y = Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)); - triangle.get(i).set(j, x + y); + f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); } } - return triangle.get(0).get(0); + return f[0]; } } ``` @@ -228,12 +228,14 @@ class Solution { class Solution { public: int minimumTotal(vector>& triangle) { - for (int i = triangle.size() - 2; ~i; --i) { + int n = triangle.size(); + vector f(n + 1, 0); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } }; ``` @@ -242,12 +244,14 @@ public: ```go func minimumTotal(triangle [][]int) int { - for i := len(triangle) - 2; i >= 0; i-- { + n := len(triangle) + f := make([]int, n+1) + for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]) + f[j] = min(f[j], f[j+1]) + triangle[i][j] } } - return triangle[0][0] + return f[0] } ``` @@ -255,12 +259,14 @@ func minimumTotal(triangle [][]int) int { ```ts function minimumTotal(triangle: number[][]): number { - for (let i = triangle.length - 2; ~i; --i) { + const n = triangle.length; + const f: number[] = Array(n + 1).fill(0); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - triangle[i][j] += Math.min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } ``` @@ -269,13 +275,14 @@ function minimumTotal(triangle: number[][]): number { ```rust impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { - let mut triangle = triangle; - for i in (0..triangle.len() - 1).rev() { + let n = triangle.len(); + let mut f = vec![0; n + 1]; + for i in (0..n).rev() { for j in 0..=i { - triangle[i][j] += triangle[i + 1][j].min(triangle[i + 1][j + 1]); + f[j] = f[j].min(f[j + 1]) + triangle[i][j]; } } - triangle[0][0] + f[0] } } ``` @@ -284,28 +291,4 @@ impl Solution { - - -### 方法三 - - - -#### Python3 - -```python -class Solution: - def minimumTotal(self, triangle: List[List[int]]) -> int: - n = len(triangle) - for i in range(n - 2, -1, -1): - for j in range(i + 1): - triangle[i][j] = ( - min(triangle[i + 1][j], triangle[i + 1][j + 1]) + triangle[i][j] - ) - return triangle[0][0] -``` - - - - - diff --git a/solution/0100-0199/0120.Triangle/README_EN.md b/solution/0100-0199/0120.Triangle/README_EN.md index 29ff0a93f9e00..55734af3e77f6 100644 --- a/solution/0100-0199/0120.Triangle/README_EN.md +++ b/solution/0100-0199/0120.Triangle/README_EN.md @@ -63,20 +63,14 @@ The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above) ### Solution 1: Dynamic Programming -We define $f[i][j]$ as the minimum path sum from the bottom of the triangle to the position $(i, j)$. Here, the position $(i, j)$ refers to the position in the $i$th row and $j$th column of the triangle (both starting from $0$). Then we have the following state transition equation: +We define $f[i][j]$ as the minimum path sum from the bottom of the triangle to position $(i, j)$. Here, position $(i, j)$ refers to the position in row $i$ and column $j$ of the triangle (both indexed from $0$). We have the following state transition equation: $$ -f[i][j] = \min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j] +f[i][j] = \min(f[i + 1][j], f[i + 1][j + 1]) + \text{triangle}[i][j] $$ The answer is $f[0][0]$. -We notice that the state $f[i][j]$ is only related to the states $f[i + 1][j]$ and $f[i + 1][j + 1]$, so we can use a one-dimensional array instead of a two-dimensional array, reducing the space complexity from $O(n^2)$ to $O(n)$. - -The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Here, $n$ is the number of rows in the triangle. - -Furthermore, we can directly reuse the `triangle` as the `f` array, so there is no need to create an additional `f` array, reducing the space complexity to $O(1)$. - #### Python3 @@ -98,13 +92,13 @@ class Solution: class Solution { public int minimumTotal(List> triangle) { int n = triangle.size(); - int[] f = new int[n + 1]; + int[][] f = new int[n + 1][n + 1]; for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle.get(i).get(j); } } - return f[0]; + return f[0][0]; } } ``` @@ -116,14 +110,13 @@ class Solution { public: int minimumTotal(vector>& triangle) { int n = triangle.size(); - int f[n + 1]; - memset(f, 0, sizeof(f)); - for (int i = n - 1; ~i; --i) { + vector> f(n + 1, vector(n + 1, 0)); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } }; ``` @@ -133,13 +126,16 @@ public: ```go func minimumTotal(triangle [][]int) int { n := len(triangle) - f := make([]int, n+1) + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, n+1) + } for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - f[j] = min(f[j], f[j+1]) + triangle[i][j] + f[i][j] = min(f[i+1][j], f[i+1][j+1]) + triangle[i][j] } } - return f[0] + return f[0][0] } ``` @@ -148,13 +144,13 @@ func minimumTotal(triangle [][]int) int { ```ts function minimumTotal(triangle: number[][]): number { const n = triangle.length; - const f: number[] = Array(n + 1).fill(0); - for (let i = n - 1; ~i; --i) { + const f: number[][] = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0)); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } ``` @@ -164,13 +160,13 @@ function minimumTotal(triangle: number[][]): number { impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { let n = triangle.len(); - let mut f = vec![0; n + 1]; + let mut f = vec![vec![0; n + 1]; n + 1]; for i in (0..n).rev() { for j in 0..=i { - f[j] = f[j].min(f[j + 1]) + triangle[i][j]; + f[i][j] = f[i + 1][j].min(f[i + 1][j + 1]) + triangle[i][j]; } } - f[0] + f[0][0] } } ``` @@ -181,7 +177,11 @@ impl Solution { -### Solution 2 +### Solution 2: Dynamic Programming (Space Optimization) + +We notice that the state $f[i][j]$ only depends on states $f[i + 1][j]$ and $f[i + 1][j + 1]$. Therefore, we can use a one-dimensional array instead of a two-dimensional array, reducing the space complexity from $O(n^2)$ to $O(n)$. + +The time complexity is $O(n^2)$, and the space complexity is $O(n)$, where $n$ is the number of rows in the triangle. @@ -203,14 +203,14 @@ class Solution: ```java class Solution { public int minimumTotal(List> triangle) { - for (int i = triangle.size() - 2; i >= 0; --i) { + int n = triangle.size(); + int[] f = new int[n + 1]; + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - int x = triangle.get(i).get(j); - int y = Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)); - triangle.get(i).set(j, x + y); + f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); } } - return triangle.get(0).get(0); + return f[0]; } } ``` @@ -221,12 +221,14 @@ class Solution { class Solution { public: int minimumTotal(vector>& triangle) { - for (int i = triangle.size() - 2; ~i; --i) { + int n = triangle.size(); + vector f(n + 1, 0); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } }; ``` @@ -235,12 +237,14 @@ public: ```go func minimumTotal(triangle [][]int) int { - for i := len(triangle) - 2; i >= 0; i-- { + n := len(triangle) + f := make([]int, n+1) + for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]) + f[j] = min(f[j], f[j+1]) + triangle[i][j] } } - return triangle[0][0] + return f[0] } ``` @@ -248,12 +252,14 @@ func minimumTotal(triangle [][]int) int { ```ts function minimumTotal(triangle: number[][]): number { - for (let i = triangle.length - 2; ~i; --i) { + const n = triangle.length; + const f: number[] = Array(n + 1).fill(0); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - triangle[i][j] += Math.min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } ``` @@ -262,13 +268,14 @@ function minimumTotal(triangle: number[][]): number { ```rust impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { - let mut triangle = triangle; - for i in (0..triangle.len() - 1).rev() { + let n = triangle.len(); + let mut f = vec![0; n + 1]; + for i in (0..n).rev() { for j in 0..=i { - triangle[i][j] += triangle[i + 1][j].min(triangle[i + 1][j + 1]); + f[j] = f[j].min(f[j + 1]) + triangle[i][j]; } } - triangle[0][0] + f[0] } } ``` @@ -277,28 +284,4 @@ impl Solution { - - -### Solution 3 - - - -#### Python3 - -```python -class Solution: - def minimumTotal(self, triangle: List[List[int]]) -> int: - n = len(triangle) - for i in range(n - 2, -1, -1): - for j in range(i + 1): - triangle[i][j] = ( - min(triangle[i + 1][j], triangle[i + 1][j + 1]) + triangle[i][j] - ) - return triangle[0][0] -``` - - - - - diff --git a/solution/0100-0199/0120.Triangle/Solution.cpp b/solution/0100-0199/0120.Triangle/Solution.cpp index 8324e1432b429..c286fb5384121 100644 --- a/solution/0100-0199/0120.Triangle/Solution.cpp +++ b/solution/0100-0199/0120.Triangle/Solution.cpp @@ -2,13 +2,12 @@ class Solution { public: int minimumTotal(vector>& triangle) { int n = triangle.size(); - int f[n + 1]; - memset(f, 0, sizeof(f)); - for (int i = n - 1; ~i; --i) { + vector> f(n + 1, vector(n + 1, 0)); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } -}; \ No newline at end of file +}; diff --git a/solution/0100-0199/0120.Triangle/Solution.go b/solution/0100-0199/0120.Triangle/Solution.go index 3c6a55ad9a78d..fae801e3bb4ff 100644 --- a/solution/0100-0199/0120.Triangle/Solution.go +++ b/solution/0100-0199/0120.Triangle/Solution.go @@ -1,10 +1,13 @@ func minimumTotal(triangle [][]int) int { n := len(triangle) - f := make([]int, n+1) + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, n+1) + } for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - f[j] = min(f[j], f[j+1]) + triangle[i][j] + f[i][j] = min(f[i+1][j], f[i+1][j+1]) + triangle[i][j] } } - return f[0] -} \ No newline at end of file + return f[0][0] +} diff --git a/solution/0100-0199/0120.Triangle/Solution.java b/solution/0100-0199/0120.Triangle/Solution.java index 7bf72bf2c0d5d..0ac34aa82c8c5 100644 --- a/solution/0100-0199/0120.Triangle/Solution.java +++ b/solution/0100-0199/0120.Triangle/Solution.java @@ -1,12 +1,12 @@ class Solution { public int minimumTotal(List> triangle) { int n = triangle.size(); - int[] f = new int[n + 1]; + int[][] f = new int[n + 1][n + 1]; for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle.get(i).get(j); } } - return f[0]; + return f[0][0]; } -} \ No newline at end of file +} diff --git a/solution/0100-0199/0120.Triangle/Solution.rs b/solution/0100-0199/0120.Triangle/Solution.rs index 446e48438da5b..d2f3830ded3d2 100644 --- a/solution/0100-0199/0120.Triangle/Solution.rs +++ b/solution/0100-0199/0120.Triangle/Solution.rs @@ -1,12 +1,12 @@ impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { let n = triangle.len(); - let mut f = vec![0; n + 1]; + let mut f = vec![vec![0; n + 1]; n + 1]; for i in (0..n).rev() { for j in 0..=i { - f[j] = f[j].min(f[j + 1]) + triangle[i][j]; + f[i][j] = f[i + 1][j].min(f[i + 1][j + 1]) + triangle[i][j]; } } - f[0] + f[0][0] } } diff --git a/solution/0100-0199/0120.Triangle/Solution.ts b/solution/0100-0199/0120.Triangle/Solution.ts index 93969b6180aec..2107bea05b531 100644 --- a/solution/0100-0199/0120.Triangle/Solution.ts +++ b/solution/0100-0199/0120.Triangle/Solution.ts @@ -1,10 +1,10 @@ function minimumTotal(triangle: number[][]): number { const n = triangle.length; - const f: number[] = Array(n + 1).fill(0); - for (let i = n - 1; ~i; --i) { + const f: number[][] = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0)); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; + f[i][j] = Math.min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]; } } - return f[0]; + return f[0][0]; } diff --git a/solution/0100-0199/0120.Triangle/Solution2.cpp b/solution/0100-0199/0120.Triangle/Solution2.cpp index a73b51182ee2f..11cd8dca4920c 100644 --- a/solution/0100-0199/0120.Triangle/Solution2.cpp +++ b/solution/0100-0199/0120.Triangle/Solution2.cpp @@ -1,11 +1,13 @@ class Solution { public: int minimumTotal(vector>& triangle) { - for (int i = triangle.size() - 2; ~i; --i) { + int n = triangle.size(); + vector f(n + 1, 0); + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } -}; \ No newline at end of file +}; diff --git a/solution/0100-0199/0120.Triangle/Solution2.go b/solution/0100-0199/0120.Triangle/Solution2.go index 252de43cf0acf..5a931edf2d274 100644 --- a/solution/0100-0199/0120.Triangle/Solution2.go +++ b/solution/0100-0199/0120.Triangle/Solution2.go @@ -1,8 +1,10 @@ func minimumTotal(triangle [][]int) int { - for i := len(triangle) - 2; i >= 0; i-- { + n := len(triangle) + f := make([]int, n+1) + for i := n - 1; i >= 0; i-- { for j := 0; j <= i; j++ { - triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]) + f[j] = min(f[j], f[j+1]) + triangle[i][j] } } - return triangle[0][0] -} \ No newline at end of file + return f[0] +} diff --git a/solution/0100-0199/0120.Triangle/Solution2.java b/solution/0100-0199/0120.Triangle/Solution2.java index 3f3fd591132b8..19c70d7fa7171 100644 --- a/solution/0100-0199/0120.Triangle/Solution2.java +++ b/solution/0100-0199/0120.Triangle/Solution2.java @@ -1,12 +1,12 @@ class Solution { public int minimumTotal(List> triangle) { - for (int i = triangle.size() - 2; i >= 0; --i) { + int n = triangle.size(); + int[] f = new int[n + 1]; + for (int i = n - 1; i >= 0; --i) { for (int j = 0; j <= i; ++j) { - int x = triangle.get(i).get(j); - int y = Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)); - triangle.get(i).set(j, x + y); + f[j] = Math.min(f[j], f[j + 1]) + triangle.get(i).get(j); } } - return triangle.get(0).get(0); + return f[0]; } -} \ No newline at end of file +} diff --git a/solution/0100-0199/0120.Triangle/Solution2.rs b/solution/0100-0199/0120.Triangle/Solution2.rs index dee8ef3772966..446e48438da5b 100644 --- a/solution/0100-0199/0120.Triangle/Solution2.rs +++ b/solution/0100-0199/0120.Triangle/Solution2.rs @@ -1,11 +1,12 @@ impl Solution { pub fn minimum_total(triangle: Vec>) -> i32 { - let mut triangle = triangle; - for i in (0..triangle.len() - 1).rev() { + let n = triangle.len(); + let mut f = vec![0; n + 1]; + for i in (0..n).rev() { for j in 0..=i { - triangle[i][j] += triangle[i + 1][j].min(triangle[i + 1][j + 1]); + f[j] = f[j].min(f[j + 1]) + triangle[i][j]; } } - triangle[0][0] + f[0] } } diff --git a/solution/0100-0199/0120.Triangle/Solution2.ts b/solution/0100-0199/0120.Triangle/Solution2.ts index f448dbb021d9b..077d4450008b6 100644 --- a/solution/0100-0199/0120.Triangle/Solution2.ts +++ b/solution/0100-0199/0120.Triangle/Solution2.ts @@ -1,8 +1,10 @@ function minimumTotal(triangle: number[][]): number { - for (let i = triangle.length - 2; ~i; --i) { + const n = triangle.length; + const f: number[] = Array(n + 1).fill(0); + for (let i = n - 1; i >= 0; --i) { for (let j = 0; j <= i; ++j) { - triangle[i][j] += Math.min(triangle[i + 1][j], triangle[i + 1][j + 1]); + f[j] = Math.min(f[j], f[j + 1]) + triangle[i][j]; } } - return triangle[0][0]; + return f[0]; } diff --git a/solution/0100-0199/0120.Triangle/Solution3.py b/solution/0100-0199/0120.Triangle/Solution3.py deleted file mode 100644 index e7b530df106ba..0000000000000 --- a/solution/0100-0199/0120.Triangle/Solution3.py +++ /dev/null @@ -1,9 +0,0 @@ -class Solution: - def minimumTotal(self, triangle: List[List[int]]) -> int: - n = len(triangle) - for i in range(n - 2, -1, -1): - for j in range(i + 1): - triangle[i][j] = ( - min(triangle[i + 1][j], triangle[i + 1][j + 1]) + triangle[i][j] - ) - return triangle[0][0]