LeetCode/Pascal's Triangle

6214 단어 파이썬leetcode
( 블로그 기사 의 전재)

[ h tps : // / ㅇ t 여기. 코 m / p 로b ㎇ ms / 파 s 또는 ls-t 리안 g ぇ / ]

Given a non-negative integer numRows, generate the first numRows of Pascal's triangle.

In Pascal's triangle, each number is the sum of the two numbers directly above it.

Example:

파스칼의 삼각형이라고 불리는 것을, 수열을 거듭해 가는 것으로 만듭니다.
각각의 수열은, 상단의 수열의 2개의 값의 합이 되어 있는 것이 특징입니다.

해답·해설



해법 1

내 submit 한 기술입니다.
어리석게 numRows 단째까지의 수열을 1개 1개 만들어, 쌓아 갑니다.

상단의 수열의 두 값을 더하여 새로운 수열을 계산할 때,
l_pre = [0]+ans[-1]+[0]
와 같이 수열의 양단에 [0]을 추가하고,
l_nxt = [l_pre[i]+l_pre[i+1] for i in range(len(l_pre)-1)]
처럼 깔끔한 루프 처리가 되도록 하고 있습니다.
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        ans = []
        if numRows > 0:
            ans.append([1])
            for _ in range(numRows-1):
                l_pre = [0]+ans[-1]+[0]
                l_nxt = [l_pre[i]+l_pre[i+1] for i in range(len(l_pre)-1)]
                ans.append(l_nxt)
        return ans

해법 2

Discussion 중, 이것은 좋다고 생각한 해법을 소개합니다.

pascal = [[1]*(i+1) for i in range(numRows)]
로서, 처음에 모든 값을 1로 해 numRows 단째까지의 삼각형을 만들어 버리고 나서, 올바른 값을 대입합니다.

해법 1과 비교해 시간·공간 계산량은 변하지 않습니다만, 공식보다 더욱 깔끔한 아름다운 해법이라고 생각합니다.
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        pascal = [[1]*(i+1) for i in range(numRows)]
        for i in range(numRows):
            for j in range(1,i):
                pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j]
        return pascal

좋은 웹페이지 즐겨찾기