Giả sử chúng ta có một số n. Ta phải sinh tam giác Pascal đến n dòng. Tam giác Pascal sẽ trông như thế này -
Tính chất của tam giác Pascal là tổng của mỗi hai số liền kề của hàng trước là giá trị của số được đặt ngay bên dưới hàng thứ hai. Ví dụ: số 10 đầu tiên ở hàng 6 là tổng của 4 và 6 ở hàng 5 và số 10 thứ hai là tổng của hai số 6 và 4 ở hàng 5
Vì vậy, nếu đầu vào giống như n = 5, thì đầu ra sẽ là
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- đối với tôi trong khoảng từ 0 đến n+1, hãy làm
- cho j trong phạm vi 0 đến n-i, làm
- C. = 1
- đối với j trong phạm vi 1 đến i+1, hãy làm
- in C sau đó là một khoảng trống
- C. = thương của [C *[i - j] / j]
- đi đến dòng tiếp theo
Thí dụ
Chúng ta hãy xem triển khai sau đây để hiểu rõ hơn -
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]
Đầu vào
5
đầu ra
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
题目
Cho chỉ số k không âm trong đó k ≤ 33, trả về hàng chỉ số thứ k của tam giác Pascal
Lưu ý rằng chỉ số hàng bắt đầu từ 0
解题思路
对于每一行,从后向前求,就不需要额外空间了
代码
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
视频讲解 YouTube List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
73class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
74class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
74class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
76class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
77class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
78def solve[n]:
for i in range[n+1]:
for j in range[n-i]:
print[' ', end='']
C = 1
for j in range[1, i+1]:
print[C, ' ', sep='', end='']
C = C * [i - j] // j
print[]
n = 5
solve[n]
77def solve[n]:
for i in range[n+1]:
for j in range[n-i]:
print[' ', end='']
C = 1
for j in range[1, i+1]:
print[C, ' ', sep='', end='']
C = C * [i - j] // j
print[]
n = 5
solve[n]
70 0C0
1C0 1C1
2C0 2C1 2C2
3C0 3C1 3C2 3C3
45
785
79
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]75
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71____275
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]78
đầu ra
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]7
Độ phức tạp về thời gian. O[N2]
Không gian phụ trợ. Ô[1]
Phương pháp 2. Chúng ta có thể tối ưu hóa đoạn mã trên bằng khái niệm sau về Hệ số nhị thức, mục nhập thứ i trong một dòng số là Hệ số nhị thức C[dòng, i] và tất cả các dòng bắt đầu bằng giá trị 1. Ý tưởng là tính toán C[dòng, i] bằng cách sử dụng C[dòng, i-1]
57
Triển khai
Python3
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]64
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C32
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C33
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C34
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C35
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C36
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C37
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C38
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C39
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
570
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]650
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]79
570
571
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C36
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]73
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C38
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C39
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]660
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]650
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]77
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C37
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]79
570
571
572
575
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C300
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C301
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C34
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C303
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C305
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71____607____64
570
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C36
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]73
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C38
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C39
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
570
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C317
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]79
570
571
572
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C322
572
575
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C300
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C327
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C34
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C329
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C330
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C331
572
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C333
572
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C307
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C34
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C307
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
77 def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]75
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]77
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C341
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
74class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
74 def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]73
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71____275
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]78
đầu ra
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]7
Độ phức tạp về thời gian. O[N2]
Không gian phụ. Ô[1]
Phương pháp 3. Đây là phương pháp tối ưu nhất để in tam giác Pascal, phương pháp này dựa trên lũy thừa của 11
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
7Thực hiện
Python3
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]64
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C32
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C33
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C34
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C35
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C353
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C36
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C37
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C38
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C39
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]70
_______171____660
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]71
575
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C300
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C377
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C378
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C380
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C381
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C380
def solve[n]: for i in range[n+1]: for j in range[n-i]: print[' ', end=''] C = 1 for j in range[1, i+1]: print[C, ' ', sep='', end=''] C = C * [i - j] // j print[] n = 5 solve[n]648
0C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C384
class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
77class Solution:
def getRow[self, rowIndex: int] -> List[int]:
res = [1]
for i in range[rowIndex]:
for j in range[i, 0, -1]:
res[j] += res[j - 1]
res.append[1]
return res
770C0 1C0 1C1 2C0 2C1 2C2 3C0 3C1 3C2 3C387