Programming & Development / April 8, 2025

LeetCode 119: Pascal's Triangle II in Go – Efficient Solution Using Dynamic Programming

Go Golang LeetCode Pascal's Triangle Dynamic Programming Binomial Coefficients Row of Pascal's Triangle Optimization

Introduction

LeetCode 119: Pascal's Triangle II asks us to return a specific row of Pascal’s Triangle, given an index rowIndex. Pascal's Triangle is a triangular array of binomial coefficients, where each element is the sum of the two numbers directly above it. The task is to compute the values of a particular row in Pascal's Triangle.

This problem is an application of dynamic programming or binomial coefficients. The nth row of Pascal's Triangle can be derived from the (n-1)th row by simple additions, but for an optimized approach, we can calculate each element in the row using binomial coefficient formulas.

Problem Statement

Given an integer rowIndex, return the rowIndexth row of Pascal's Triangle.

Example:

go

Input: rowIndex = 3
Output: [1,3,3,1]

Pascal’s Triangle looks like this:

markdown

      1
     1 1
    1 2 1
   1 3 3 1

For rowIndex = 3, the output is [1, 3, 3, 1].

Approach:

Pascal's Triangle Construction:

Each row of Pascal’s Triangle is derived from the row above it. For a given row r, its elements can be calculated as:

  • The first and last element of each row are 1.
  • The intermediate elements are the sum of two numbers from the previous row.

Optimized Approach:

Rather than building the entire triangle up to rowIndex, we can optimize the solution by using the binomial coefficient formula. The kth element in the nth row can be computed as:

  • C(n, k) = n! / (k! * (n - k)!)

However, to avoid the expensive factorial computation, we can calculate each element iteratively using the formula:

  • C(n, k) = C(n, k-1) * (n - k + 1) / k

This allows us to compute each element of the row directly, iterating through the row from left to right.

Go Implementation

Solution Using Iterative Approach with Optimization

go

package main

import "fmt"

// generateRow returns the rowIndex-th row of Pascal's Triangle
func generateRow(rowIndex int) []int {
    row := make([]int, rowIndex+1)
    row[0] = 1 // The first element of every row is 1

    for k := 1; k <= rowIndex; k++ {
        // Calculate the binomial coefficient using the previous value
        row[k] = row[k-1] * (rowIndex - k + 1) / k
    }
    
    return row
}

func main() {
    rowIndex := 3
    result := generateRow(rowIndex)
    fmt.Println(result) // Output: [1 3 3 1]
}

Explanation:

  1. generateRow Function:
  • The generateRow function generates the rowIndexth row of Pascal’s Triangle using an iterative approach.
  • We start by initializing an array row of size rowIndex+1 (since the row starts from index 0).
  • The first element is always 1 as the first element of every row in Pascal's Triangle is 1.
  • For each subsequent element k in the row, we calculate it iteratively using the binomial coefficient formula:
  • row[k]=row[k−1]×(rowIndex−k+1)k\text{row}[k] = \text{row}[k-1] \times \frac{(rowIndex - k + 1)}{k}row[k]=row[k−1]×k(rowIndex−k+1)​
  • This formula avoids calculating large factorials and directly computes the elements of the row efficiently.
  1. Main Function:
  • We call generateRow with the desired rowIndex, and print the result.

Time and Space Complexity

MetricComplexityTime ComplexityO(rowIndex)Space ComplexityO(rowIndex)

Time Complexity:

  • The time complexity is O(rowIndex) because we iterate through the elements of the row exactly once to compute the binomial coefficients.

Space Complexity:

  • The space complexity is O(rowIndex) due to the array that stores the row, which has rowIndex + 1 elements.

Edge Cases

  1. Edge Case: rowIndex = 0
  • Input: rowIndex = 0
  • Output: [1]
  • Explanation: The first row of Pascal’s Triangle is always [1].
  1. Edge Case: rowIndex = 1
  • Input: rowIndex = 1
  • Output: [1, 1]
  • Explanation: The second row of Pascal’s Triangle is [1, 1].
  1. Edge Case: Large rowIndex
  • Input: rowIndex = 30
  • Output: A large array representing the 30th row of Pascal’s Triangle.
  • Explanation: This approach efficiently computes the row even for large values of rowIndex without building the entire triangle.

Conclusion

LeetCode 119: Pascal's Triangle II is a problem that can be solved efficiently by directly computing the desired row using the binomial coefficient formula. By iterating through the row and calculating each element iteratively, we avoid the need to compute factorials or build the entire triangle, resulting in a more time-efficient solution.

This solution runs in O(rowIndex) time and uses O(rowIndex) space, making it suitable for large values of rowIndex.


Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex