🖋
LeetCode 118. Pascal's Triangle
はじめに
LeetCode 「118. Pascal's Triangle」の問題をGoで解きました。
問題
問題文
Given an integer numRows, return the first numRows of Pascal's triangle.
In Pascal's triangle, each number is the sum of the two numbers directly above it as shown:
和訳
整数 numRows が与えられたとき、パスカルの三角形の最初の numRows を返す。
パスカルの三角形では、各数値はその真上にある2つの数値の和となる:
例
Input: numRows = 5
Output: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
Input: numRows = 1
Output: [[1]]
制約
- 1 <= numRows <= 30
解答
パスカルの三角形 を構築する問題です。
以下の手順で実装します。
- numRows 行分の2次元スライスを用意
- 各行に i+1 個のようを持つスライスを作成
- 各要素jに対して
- 先頭・末尾は1
- それ以外は前の行の j-1番目 + j番目 の値
コード
func generate(numRows int) [][]int {
triangle := make([][]int, numRows)
for i := 0; i < numRows; i++ {
row := make([]int, i+1)
for j := 0; j <= i; j++ {
if j == 0 || j == i {
row[j] = 1
} else {
row[j] = triangle[i-1][j-1] + triangle[i-1][j]
}
}
triangle[i] = row
}
return triangle
}
また、各要素を作成する際に、あらかじめ先頭と末尾に1を代入することにより、
if文を減らし簡潔に実装することも可能です。
func generate(numRows int) [][]int {
triangle := make([][]int, numRows)
for i := 0; i < numRows; i++ {
row := make([]int, i+1)
row[0], row[i] = 1, 1
for j := 1; j < i; j++ {
row[j] = triangle[i-1][j-1] + triangle[i-1][j]
}
triangle[i] = row
}
return triangle
}
計算量
- 時間的計算量:O(n²)
- 空間的計算量:O(n²)
Discussion