LeetCode 題目 118:楊輝三角

題目描述

給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。在楊輝三角中,每個數是它左上方和右上方的數的和。

楊輝三角解析

在這個詳解中,我們將使用 ASCII 圖形來說明楊輝三角的構建過程,包括逐行添加新的行的過程。這個圖解可以幫助理解每一行是如何基于前一行構建的。

楊輝三角的構建過程

初始狀態
  1. 開始時,楊輝三角是空的。
第1行
  1. 添加第一行,只有一個數字 1
1
第2行
  1. 第二行有兩個 1,每個都位于行的邊界。
1
1 1
第3行
  1. 第三行中間的數字是上一行兩個相鄰數字之和(1 + 1)。
  11 1
1 2 1
第4行
  1. 第四行,中間的兩個數字分別是上一行相鄰兩數之和(1+2 和 2+1)。
    11 11 2 11 3 3 1
第5行
  1. 第五行,中間三個數字由上行相鄰數字之和得到(1+3、3+3 和 3+1)。
      11 11 2 11 3 3 11 4 6 4 1
總結過程
  • 楊輝三角的每一行都從 1 開始和結束。
  • 除了第一個和最后一個數字外,每個數字都是它正上方兩個數字的和。
  • n 行(從 1 開始計數)有 n 個數字。

解題思路與算法

方法一:逐行構建
解題步驟:
  1. 初始化一個空列表 triangle 作為結果。
  2. 遍歷從 0numRows-1 的每一行。
  3. 對于每一行,創建一個長度等于行號加一的新行,首尾元素設為1。
  4. 對于每一行的中間元素,按照楊輝三角的規則,由上一行的相鄰兩個元素求和得到。
  5. 將構建好的行添加到 triangle 中。
Python 代碼示例
def generate(numRows):"""生成楊輝三角的前numRows行"""triangle = []for row_num in range(numRows):row = [None for _ in range(row_num + 1)]row[0], row[-1] = 1, 1  # 第一個和最后一個元素始終為1for j in range(1, len(row) - 1):row[j] = triangle[row_num - 1][j - 1] + triangle[row_num - 1][j]triangle.append(row)return triangle
方法二:一行代碼解
解題步驟:
  1. 使用列表推導式和遞推公式直接生成楊輝三角的每一行。
  2. 利用 Python 的生成器語法簡化代碼實現。
Python 代碼示例
def generate(numRows):"""一行代碼生成楊輝三角"""return [[1 if j == 0 or j == i else triangle[i-1][j-1] + triangle[i-1][j] for j in range(i+1)] for i in range(numRows)]
方法三:動態規劃
解題步驟:
  1. 初始化一個空列表 triangle
  2. 從第一行到第 numRows 行,利用動態規劃的思想,每一行基于前一行生成。
  3. 同樣地,每行的首尾元素為1,其他元素由上一行的兩個相鄰元素相加得到。
  4. 每生成一行即存入 triangle
Python 代碼示例
def generate(numRows):triangle = []for row_num in range(numRows):row = [1] * (row_num + 1)  # 每行元素初始化為1for j in range(1, row_num):row[j] = triangle[-1][j - 1] + triangle[-1][j]triangle.append(row)return triangle
方法四:使用遞歸
解題步驟:
  1. 定義遞歸函數,如果請求行數為1,返回只包含一行的楊輝三角。
  2. 否則,遞歸調用自身生成前 numRows - 1 行,然后基于最后一行計算新的一行,并添加到結果中。
Python 代碼示例
def generate(numRows):if numRows == 1:return [[1]]else:result = generate(numRows - 1)last_row = result[-1]new_row = [1]for i in range(1, len(last_row)):new_row.append(last_row[i - 1] + last_row[i])new_row.append(1)result.append(new_row)return result
方法五:迭代改進版
解題步驟:
  1. 初始化一個包含第一行的列表。
  2. 迭代從第二行開始,每一行都通過上一行來計算。
  3. 使用臨時列表存儲當前行,計算完成后加入最終結果。
Python 代碼示例
def generate(numRows):triangle = [[1]]for row_number in range(1, numRows):prev_row = triangle[-1]current_row = [1]for j in range(1, row_number):current_row.append(prev_row[j-1] + prev_row[j])current_row.append(1)triangle.append(current_row)return triangle

算法分析

  • 時間復雜度
    • 所有方法的時間復雜度基本為 (O(n^2)),其中 (n) 是行數。每行的計算成本大約與行號成正比。
  • 空間復雜度
    • 方法一、三、四和五:(O(n^2)),需要存儲整個三角形。
    • 方法二:同樣是 (O(n^2)),但因為使用了列表推導,可能有額外的內存開銷。

不同算法的優劣勢對比

  • 逐行構建(方法一)直觀易理解,適合大多數初學者。
  • 一行代碼解(方法二)代碼簡潔,但可能在理解和調試時較為復雜。
  • 動態規劃(方法三)標準且易于理解,展示了動態規劃思想的典型應用。
  • 使用遞歸(方法四)代碼簡潔,但對于大的行數可能導致調用棧溢出。
  • 迭代改進版(方法五)提供了介于方法一和方法三之間的解決方案,保持了代碼的清晰性和執行的高效性。

應用示例

楊輝三角可以用于計算組合數學中的二項式系數,這在概率論、統計學和算法設計中非常有用。例如,它可以用來計算多項式展開的系數,或者在計算概率時快速找到相關的系數。在圖形設計中,楊輝三角也被用于計算貝塞爾曲線等復雜圖形的點。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10599.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

250 基于matlab的5種時頻分析方法((短時傅里葉變換)STFT

基于matlab的5種時頻分析方法((短時傅里葉變換)STFT,Gabor展開和小波變換,Wigner-Ville(WVD),偽Wigner-Ville分布(PWVD),平滑偽Wigner-Ville分布(SPWVD),每條程序都有詳細的說明,設置仿真信號進行時頻輸出。…

Parted分區大容量磁盤

創建了新的虛擬磁盤10T , 掛載后分區格式化一.fdisk無法創建大容量的分區 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css實現個人簡歷表單的制作

根據下列要求,做出下圖所示的個人簡歷(表單) 表單要求 Ⅰ、表格整體的邊框為1像素,單元格間距為0,表格中前六列列寬均為100像素,第七列 為200像素,表格整體在頁面上居中顯示; Ⅱ、前…

git提交代碼異常報錯error:bad signature 0x00000000

報錯信息 error:bad signature 0x00000000 異常原因 git 提交過程中異常關機或重啟,造成當前項目工程中的.git/index 文件損壞,無法提交 解決步驟 刪除.git/index文件 rm -f .git/index 重啟git git reset

Java 【數據結構】 哈希(Hash超詳解)HashSetHashMap【神裝】

登神長階 第十神裝 HashSet 第十一神裝 HashMap 目錄 👔一.哈希 🧥1.概念 🩳2.Object類的hashCode()方法: 👚3.String類的哈希碼: 👠4.注意事項: 🎷二.哈希桶 🪗1.哈希桶原理 &#x…

Bert基礎(二十二)--Bert實戰:對話機器人

一 、概念簡介 1.1 生成式對話機器人 1.1.1什么是生成式對話機器人? 生成式對話機器人是一種能夠通過自然語言交互來理解和生成響應的人工智能系統。它們能夠進行開放域的對話,即在對話過程中,機器人可以根據用戶的需求和上下文信息,自主地生成新的、連貫的回復,而不僅…

如何使用CertCrunchy從SSL證書中發現和識別潛在的主機名稱

關于CertCrunchy CertCrunchy是一款功能強大的網絡偵查工具,該工具基于純Python開發,廣大研究人員可以利用該工具輕松從SSL證書中發現和識別潛在的主機信息。 支持的在線源 該工具支持從在線源或給定IP地址范圍獲取SSL證書的相關數據,并檢索…

大數據測試

1、前言 大數據測試是對大數據應用程序的測試過程,以確保大數據應用程序的所有功能按預期工作。大數據測試的目標是確保大數據系統在保持性能和安全性的同時,平穩無差錯地運行。 大數據是無法使用傳統計算技術處理的大型數據集的集合。這些數據集的測試涉…

Foxmail使用經驗總結

本篇博客將詳盡講解如何利用Foxmail進行高效的郵件管理,以及一些實用的使用技巧,讓郵件管理變得更為高效和有序。 1. 賬戶設置與管理 多賬戶整合:Foxmail支持多個郵件賬戶同時管理,用戶可以將個人和工作郵箱整合在同一個界面&am…

實戰中使用 QEMU 進行內網穿透

前言 閱讀 https://xz.aliyun.com/t/14052 《使用 QEMU 進行內網穿透?》 https://securelist.com/network-tunneling-with-qemu/111803/ 《Network tunneling with… QEMU?》 我將此項技術應用到實戰中,取得不錯的效果,但是也遇到很多坑&am…

機器學習算法應用——樸素貝葉斯分類器

樸素貝葉斯分類器 樸素貝葉斯分類器(Naive Bayes Classifier)是一種基于貝葉斯定理和特征條件獨立假設的分類方法。它適用于分類任務,特別是文本分類、垃圾郵件識別等領域。 原理 樸素貝葉斯分類器基于以下兩個主要假設: 特征條…

JS_ES6(1)

作用域鏈: 作用域鏈是底層變量查找的機制:當函數執行時,優先查找當前函數作用域中有無需要用到的變量,如果找不到,逐級查找父級,直到全局 > 嵌套關系形成作用域鏈,同一作用域鏈從小到大查找…

taro3兼容支付寶/微信小程序的自定義拖拽排序組件

描述:列表可以完成拖拽排序 此組件是根據支付寶原生文檔改編成taro-vue3的形式,只保留了拖拽的部分,其他功能都去除了,測試下來可以兼容支付寶和微信小程序。 支付寶原生文檔: https://opendocs.alipay.com/support/…

BGP(border gateway protocol)邊界網關協議初識篇

BGP它是一種路徑矢量協議,用于決定數據包在互聯網中的最佳路徑。 1、工作原理: 自治系統(AS)間路由: BGP主要用于連接不同自治系統之間的路由器,其中每個自治系統(AS)代表一組具有共同路由的網…

編譯 fdk-aac

文章目錄 關于 fdk-aac編譯 fdk-aac在 FFMpeg 編譯中啟用 關于 fdk-aac A standalone library of the Fraunhofer FDK AAC code from Android. github : https://github.com/mstorsjo/fdk-aac代碼托管 : https://sourceforge.net/projects/opencore-am…

最新巨量X-Bogus、_signature參數逆向分析與算法還原

文章目錄 1. 寫在前面2. 接口分析3. 斷點分析4. 扣代碼補環境5. 數據解密 【🏠作者主頁】:吳秋霖 【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路…

# 從淺入深 學習 SpringCloud 微服務架構(十六)

從淺入深 學習 SpringCloud 微服務架構(十六) 一、SpringCloudStream:自定義消息通道 1、在子工程 stream_product (子模塊)中,創建 自定義的消息通道類 MyProcessor.java /*** spring_cloud_demo\stream_product…

JavaEE概述 + Maven

文章目錄 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 倉庫 坐標2.2 Maven之項目構建2.3 Maven之依賴管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java標準版,適用于各行各業,主要是Java…

【負載均衡式在線OJ項目day5】OJ服務模塊概要

前言 經過四天的努力已經完成了編譯運行這個大模塊,今天將要進入OJ服務模塊設計,該模塊的本質就是建立一個小型網站 一.功能 為用戶提供題目列表頁面為用戶提供網站首頁(用題目列表充當首頁)為用戶提供指定題目的編輯頁面為用戶提供提交代碼判題功能&a…

FFmpeg常用API與示例(二)—— 解封裝與轉封裝

封裝層 封裝格式(container format)可以看作是編碼流(音頻流、視頻流等)數據的一層外殼,將編碼后的數據存儲于此封裝格式的文件之內。 封裝又稱容器,容器的稱法更為形象,所謂容器,就是存放內容的器具,飲料是內容&…