Skip to content

Commit e929b22

Browse files
authored
feat: add solutions to lc problem: No.0118 (#4608)
No.0118.Pascal's Triangle
1 parent c38b9e2 commit e929b22

File tree

9 files changed

+109
-69
lines changed

9 files changed

+109
-69
lines changed

solution/0100-0199/0118.Pascal's Triangle/README.md

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ tags:
5757

5858
我们先创建一个答案数组 $f$,然后将 $f$ 的第一行元素设为 $[1]$。接下来,我们从第二行开始,每一行的开头和结尾元素都是 $1$,其它 $f[i][j] = f[i - 1][j - 1] + f[i - 1][j]$。
5959

60-
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是行数
60+
时间复杂度 $O(n^2)$,其中 $n$ 为给定的行数。忽略答案的空间消耗,空间复杂度 $O(1)$
6161

6262
<!-- tabs:start -->
6363

@@ -83,8 +83,8 @@ class Solution {
8383
for (int i = 0; i < numRows - 1; ++i) {
8484
List<Integer> g = new ArrayList<>();
8585
g.add(1);
86-
for (int j = 0; j < f.get(i).size() - 1; ++j) {
87-
g.add(f.get(i).get(j) + f.get(i).get(j + 1));
86+
for (int j = 1; j < f.get(i).size(); ++j) {
87+
g.add(f.get(i).get(j - 1) + f.get(i).get(j));
8888
}
8989
g.add(1);
9090
f.add(g);
@@ -105,8 +105,8 @@ public:
105105
for (int i = 0; i < numRows - 1; ++i) {
106106
vector<int> g;
107107
g.push_back(1);
108-
for (int j = 0; j < f[i].size() - 1; ++j) {
109-
g.push_back(f[i][j] + f[i][j + 1]);
108+
for (int j = 1; j < f[i].size(); ++j) {
109+
g.push_back(f[i][j - 1] + f[i][j]);
110110
}
111111
g.push_back(1);
112112
f.push_back(g);
@@ -123,8 +123,8 @@ func generate(numRows int) [][]int {
123123
f := [][]int{[]int{1}}
124124
for i := 0; i < numRows-1; i++ {
125125
g := []int{1}
126-
for j := 0; j < len(f[i])-1; j++ {
127-
g = append(g, f[i][j]+f[i][j+1])
126+
for j := 1; j < len(f[i]); j++ {
127+
g = append(g, f[i][j-1]+f[i][j])
128128
}
129129
g = append(g, 1)
130130
f = append(f, g)
@@ -140,8 +140,8 @@ function generate(numRows: number): number[][] {
140140
const f: number[][] = [[1]];
141141
for (let i = 0; i < numRows - 1; ++i) {
142142
const g: number[] = [1];
143-
for (let j = 0; j < f[i].length - 1; ++j) {
144-
g.push(f[i][j] + f[i][j + 1]);
143+
for (let j = 1; j < f[i].length; ++j) {
144+
g.push(f[i][j - 1] + f[i][j]);
145145
}
146146
g.push(1);
147147
f.push(g);
@@ -154,21 +154,17 @@ function generate(numRows: number): number[][] {
154154

155155
```rust
156156
impl Solution {
157-
#[allow(dead_code)]
158157
pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {
159-
let mut ret_vec: Vec<Vec<i32>> = Vec::new();
160-
let mut cur_vec: Vec<i32> = Vec::new();
161-
162-
for i in 0..num_rows as usize {
163-
let mut new_vec: Vec<i32> = vec![1; i + 1];
164-
for j in 1..i {
165-
new_vec[j] = cur_vec[j - 1] + cur_vec[j];
158+
let mut f = vec![vec![1]];
159+
for i in 1..num_rows {
160+
let mut g = vec![1];
161+
for j in 1..f[i as usize - 1].len() {
162+
g.push(f[i as usize - 1][j - 1] + f[i as usize - 1][j]);
166163
}
167-
cur_vec = new_vec.clone();
168-
ret_vec.push(new_vec);
164+
g.push(1);
165+
f.push(g);
169166
}
170-
171-
ret_vec
167+
f
172168
}
173169
}
174170
```
@@ -184,8 +180,8 @@ var generate = function (numRows) {
184180
const f = [[1]];
185181
for (let i = 0; i < numRows - 1; ++i) {
186182
const g = [1];
187-
for (let j = 0; j < f[i].length - 1; ++j) {
188-
g.push(f[i][j] + f[i][j + 1]);
183+
for (let j = 1; j < f[i].length; ++j) {
184+
g.push(f[i][j - 1] + f[i][j]);
189185
}
190186
g.push(1);
191187
f.push(g);
@@ -194,6 +190,25 @@ var generate = function (numRows) {
194190
};
195191
```
196192

193+
#### C#
194+
195+
```cs
196+
public class Solution {
197+
public IList<IList<int>> Generate(int numRows) {
198+
var f = new List<IList<int>> { new List<int> { 1 } };
199+
for (int i = 1; i < numRows; ++i) {
200+
var g = new List<int> { 1 };
201+
for (int j = 1; j < f[i - 1].Count; ++j) {
202+
g.Add(f[i - 1][j - 1] + f[i - 1][j]);
203+
}
204+
g.Add(1);
205+
f.Add(g);
206+
}
207+
return f;
208+
}
209+
}
210+
```
211+
197212
<!-- tabs:end -->
198213

199214
<!-- solution:end -->

solution/0100-0199/0118.Pascal's Triangle/README_EN.md

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ tags:
4444

4545
### Solution 1: Simulation
4646

47-
First, we create an answer array $f$, and then set the first row of $f$ to $[1]$. Next, starting from the second row, the first and last elements of each row are $1$, and the other elements are calculated by $f[i][j] = f[i - 1][j - 1] + f[i - 1][j]$.
47+
We first create an answer array $f$, then set the first row of $f$ to $[1]$. Next, starting from the second row, the first and last elements of each row are $1$, and for other elements $f[i][j] = f[i - 1][j - 1] + f[i - 1][j]$.
4848

49-
The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. Here, $n$ is the number of rows.
49+
The time complexity is $O(n^2)$, where $n$ is the given number of rows. Ignoring the space consumption of the answer, the space complexity is $O(1)$.
5050

5151
<!-- tabs:start -->
5252

@@ -72,8 +72,8 @@ class Solution {
7272
for (int i = 0; i < numRows - 1; ++i) {
7373
List<Integer> g = new ArrayList<>();
7474
g.add(1);
75-
for (int j = 0; j < f.get(i).size() - 1; ++j) {
76-
g.add(f.get(i).get(j) + f.get(i).get(j + 1));
75+
for (int j = 1; j < f.get(i).size(); ++j) {
76+
g.add(f.get(i).get(j - 1) + f.get(i).get(j));
7777
}
7878
g.add(1);
7979
f.add(g);
@@ -94,8 +94,8 @@ public:
9494
for (int i = 0; i < numRows - 1; ++i) {
9595
vector<int> g;
9696
g.push_back(1);
97-
for (int j = 0; j < f[i].size() - 1; ++j) {
98-
g.push_back(f[i][j] + f[i][j + 1]);
97+
for (int j = 1; j < f[i].size(); ++j) {
98+
g.push_back(f[i][j - 1] + f[i][j]);
9999
}
100100
g.push_back(1);
101101
f.push_back(g);
@@ -112,8 +112,8 @@ func generate(numRows int) [][]int {
112112
f := [][]int{[]int{1}}
113113
for i := 0; i < numRows-1; i++ {
114114
g := []int{1}
115-
for j := 0; j < len(f[i])-1; j++ {
116-
g = append(g, f[i][j]+f[i][j+1])
115+
for j := 1; j < len(f[i]); j++ {
116+
g = append(g, f[i][j-1]+f[i][j])
117117
}
118118
g = append(g, 1)
119119
f = append(f, g)
@@ -129,8 +129,8 @@ function generate(numRows: number): number[][] {
129129
const f: number[][] = [[1]];
130130
for (let i = 0; i < numRows - 1; ++i) {
131131
const g: number[] = [1];
132-
for (let j = 0; j < f[i].length - 1; ++j) {
133-
g.push(f[i][j] + f[i][j + 1]);
132+
for (let j = 1; j < f[i].length; ++j) {
133+
g.push(f[i][j - 1] + f[i][j]);
134134
}
135135
g.push(1);
136136
f.push(g);
@@ -143,21 +143,17 @@ function generate(numRows: number): number[][] {
143143

144144
```rust
145145
impl Solution {
146-
#[allow(dead_code)]
147146
pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {
148-
let mut ret_vec: Vec<Vec<i32>> = Vec::new();
149-
let mut cur_vec: Vec<i32> = Vec::new();
150-
151-
for i in 0..num_rows as usize {
152-
let mut new_vec: Vec<i32> = vec![1; i + 1];
153-
for j in 1..i {
154-
new_vec[j] = cur_vec[j - 1] + cur_vec[j];
147+
let mut f = vec![vec![1]];
148+
for i in 1..num_rows {
149+
let mut g = vec![1];
150+
for j in 1..f[i as usize - 1].len() {
151+
g.push(f[i as usize - 1][j - 1] + f[i as usize - 1][j]);
155152
}
156-
cur_vec = new_vec.clone();
157-
ret_vec.push(new_vec);
153+
g.push(1);
154+
f.push(g);
158155
}
159-
160-
ret_vec
156+
f
161157
}
162158
}
163159
```
@@ -173,8 +169,8 @@ var generate = function (numRows) {
173169
const f = [[1]];
174170
for (let i = 0; i < numRows - 1; ++i) {
175171
const g = [1];
176-
for (let j = 0; j < f[i].length - 1; ++j) {
177-
g.push(f[i][j] + f[i][j + 1]);
172+
for (let j = 1; j < f[i].length; ++j) {
173+
g.push(f[i][j - 1] + f[i][j]);
178174
}
179175
g.push(1);
180176
f.push(g);
@@ -183,6 +179,25 @@ var generate = function (numRows) {
183179
};
184180
```
185181

182+
#### C#
183+
184+
```cs
185+
public class Solution {
186+
public IList<IList<int>> Generate(int numRows) {
187+
var f = new List<IList<int>> { new List<int> { 1 } };
188+
for (int i = 1; i < numRows; ++i) {
189+
var g = new List<int> { 1 };
190+
for (int j = 1; j < f[i - 1].Count; ++j) {
191+
g.Add(f[i - 1][j - 1] + f[i - 1][j]);
192+
}
193+
g.Add(1);
194+
f.Add(g);
195+
}
196+
return f;
197+
}
198+
}
199+
```
200+
186201
<!-- tabs:end -->
187202

188203
<!-- solution:end -->

solution/0100-0199/0118.Pascal's Triangle/Solution.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ class Solution {
66
for (int i = 0; i < numRows - 1; ++i) {
77
vector<int> g;
88
g.push_back(1);
9-
for (int j = 0; j < f[i].size() - 1; ++j) {
10-
g.push_back(f[i][j] + f[i][j + 1]);
9+
for (int j = 1; j < f[i].size(); ++j) {
10+
g.push_back(f[i][j - 1] + f[i][j]);
1111
}
1212
g.push_back(1);
1313
f.push_back(g);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
public class Solution {
2+
public IList<IList<int>> Generate(int numRows) {
3+
var f = new List<IList<int>> { new List<int> { 1 } };
4+
for (int i = 1; i < numRows; ++i) {
5+
var g = new List<int> { 1 };
6+
for (int j = 1; j < f[i - 1].Count; ++j) {
7+
g.Add(f[i - 1][j - 1] + f[i - 1][j]);
8+
}
9+
g.Add(1);
10+
f.Add(g);
11+
}
12+
return f;
13+
}
14+
}

solution/0100-0199/0118.Pascal's Triangle/Solution.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ func generate(numRows int) [][]int {
22
f := [][]int{[]int{1}}
33
for i := 0; i < numRows-1; i++ {
44
g := []int{1}
5-
for j := 0; j < len(f[i])-1; j++ {
6-
g = append(g, f[i][j]+f[i][j+1])
5+
for j := 1; j < len(f[i]); j++ {
6+
g = append(g, f[i][j-1]+f[i][j])
77
}
88
g = append(g, 1)
99
f = append(f, g)

solution/0100-0199/0118.Pascal's Triangle/Solution.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ public List<List<Integer>> generate(int numRows) {
55
for (int i = 0; i < numRows - 1; ++i) {
66
List<Integer> g = new ArrayList<>();
77
g.add(1);
8-
for (int j = 0; j < f.get(i).size() - 1; ++j) {
9-
g.add(f.get(i).get(j) + f.get(i).get(j + 1));
8+
for (int j = 1; j < f.get(i).size(); ++j) {
9+
g.add(f.get(i).get(j - 1) + f.get(i).get(j));
1010
}
1111
g.add(1);
1212
f.add(g);

solution/0100-0199/0118.Pascal's Triangle/Solution.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ var generate = function (numRows) {
66
const f = [[1]];
77
for (let i = 0; i < numRows - 1; ++i) {
88
const g = [1];
9-
for (let j = 0; j < f[i].length - 1; ++j) {
10-
g.push(f[i][j] + f[i][j + 1]);
9+
for (let j = 1; j < f[i].length; ++j) {
10+
g.push(f[i][j - 1] + f[i][j]);
1111
}
1212
g.push(1);
1313
f.push(g);
Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
impl Solution {
2-
#[allow(dead_code)]
32
pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {
4-
let mut ret_vec: Vec<Vec<i32>> = Vec::new();
5-
let mut cur_vec: Vec<i32> = Vec::new();
6-
7-
for i in 0..num_rows as usize {
8-
let mut new_vec: Vec<i32> = vec![1; i + 1];
9-
for j in 1..i {
10-
new_vec[j] = cur_vec[j - 1] + cur_vec[j];
3+
let mut f = vec![vec![1]];
4+
for i in 1..num_rows {
5+
let mut g = vec![1];
6+
for j in 1..f[i as usize - 1].len() {
7+
g.push(f[i as usize - 1][j - 1] + f[i as usize - 1][j]);
118
}
12-
cur_vec = new_vec.clone();
13-
ret_vec.push(new_vec);
9+
g.push(1);
10+
f.push(g);
1411
}
15-
16-
ret_vec
12+
f
1713
}
1814
}

solution/0100-0199/0118.Pascal's Triangle/Solution.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ function generate(numRows: number): number[][] {
22
const f: number[][] = [[1]];
33
for (let i = 0; i < numRows - 1; ++i) {
44
const g: number[] = [1];
5-
for (let j = 0; j < f[i].length - 1; ++j) {
6-
g.push(f[i][j] + f[i][j + 1]);
5+
for (let j = 1; j < f[i].length; ++j) {
6+
g.push(f[i][j - 1] + f[i][j]);
77
}
88
g.push(1);
99
f.push(g);

0 commit comments

Comments
 (0)