[LeetCode] 119. Pascal's Triangle II 楊輝三角之二


 

Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle.

Note that the row index starts from 0.


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

Example:

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

Follow up:

Could you optimize your algorithm to use only O(k) extra space?

 

楊輝三角想必大家並不陌生,應該最早出現在初高中的數學中,其實就是二項式系數的一種寫法。

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

楊輝三角形第n層(頂層稱第0層,第1行,第n層即第 n+1 行,此處n為包含0在內的自然數)正好對應於二項式 \left(a+b\right)^{n} 展開的系數。例如第二層 1 2 1 是冪指數為2的二項式 \left(a+b\right)^{2} 展開形式 a^{2}+2ab+b^{2} 的系數。

 

楊輝三角主要有下列五條性質:

  1. 楊輝三角以正整數構成,數字左右對稱,每行由1開始逐漸變大,然后變小,回到1。
  2. n行的數字個數為n個。
  3. n行的第k個數字為組合數 C_{n-1}^{k-1}
  4. n行數字和為 2^{n-1}
  5. 除每行最左側與最右側的數字以外,每個數字等於它的左上方與右上方兩個數字之和(也就是說,第n行第k個數字等於第 n-1 行的第 k-1 個數字與第k個數字的和)。這是因為有組合恆等式:C_{n}^{i}=C_{n-1}^{i-1}+C_{n-1}^{i}。可用此性質寫出整個楊輝三角形。

 

由於題目有額外限制條件,程序只能使用 O(k) 的額外空間,那么這樣就不能把每行都算出來,而是要用其他的方法, 我最先考慮用的是第三條性質,算出每個組合數來生成第n行系數,代碼請參見評論區一樓。本地調試輸出前十行,沒啥問題,拿到 OJ 上測試,程序在第 18 行跪了,中間有個系數不正確。那么問題出在哪了呢,仔細找找,原來出在計算組合數那里,由於算組合數時需要算連乘,而整型數 int 的數值范圍只有 -32768 到 32768 之間,那么一旦n值過大,連乘肯定無法計算。而喪心病狂的 OJ 肯定會測試到成百上千行,所以這個方法不行。那么我們再來考慮利用第五條性質,除了第一個和最后一個數字之外,其他的數字都是上一行左右兩個值之和。那么我們只需要兩個 for 循環,除了第一個數為1之外,后面的數都是上一次循環的數值加上它前面位置的數值之和,不停地更新每一個位置的值,便可以得到第n行的數字,具體實現代碼如下:

 

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> res(rowIndex + 1);
        res[0] = 1;
        for (int i = 1; i <= rowIndex; ++i) {
            for (int j = i; j >= 1; --j) {
                res[j] += res[j - 1];
            }
        }
        return res;
    }
};

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/119

 

類似題目:

Pascal's Triangle

 

參考資料:

https://leetcode.com/problems/pascals-triangle-ii/

https://leetcode.com/problems/pascals-triangle-ii/discuss/38420/Here-is-my-brief-O(k)-solution

https://leetcode.com/problems/pascals-triangle-ii/discuss/38478/My-accepted-java-solution-any-better-code

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM