LeetCode C++ 119. Pascal‘s Triangle II【Math/Array】简单
发布日期:2021-07-01 02:53:56 浏览次数:3 分类:技术文章

本文共 10394 字,大约阅读时间需要 34 分钟。

Given an integer rowIndex , return the rowIndexth row of the Pascal’s triangle. Notice that the row index starts from 0.

在这里插入图片描述
In Pascal’s triangle, each number is the sum of the two numbers directly above it.

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

Example 1:

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

Example 2:

Input: rowIndex = 0Output: [1]

Example 3:

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

Constraints: 0 <= rowIndex <= 40

题意:给定一个非负索引 k k k ,其中 k ≤ 33 k ≤ 33 k33 ,返回杨辉三角的第 k k k 行。


解法1 递推

为满足 O ( k ) O(k) O(k) 的空间复杂度,可以使用一个大小为 k k k 的数组,递推得到第 k k k 行:

class Solution {
public: vector
getRow(int rowIndex) {
if (rowIndex == 0) return {
1}; if (rowIndex == 1) return {
1, 1}; vector
ans{
1, 1}, temp; for (int i = 2; i <= rowIndex; ++i) {
temp.clear(); for (int j = 0; j <= i; ++j) {
if (j == 0 || j == i) temp.push_back(1); else temp.push_back(ans[j - 1] + ans[j]); } ans = temp; } return ans; }};

运行结果如下:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户内存消耗:6.7 MB, 在所有 C++ 提交中击败了10.80% 的用户

解法2 打表

C++代码如下:

class Solution {
private: vector
> pascalTriangle = {
{
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}, {
1,9,36,84,126,126,84,36,9,1}, {
1,10,45,120,210,252,210,120,45,10,1}, {
1,11,55,165,330,462,462,330,165,55,11,1}, {
1,12,66,220,495,792,924,792,495,220,66,12,1}, {
1,13,78,286,715,1287,1716,1716,1287,715,286,78,13,1}, {
1,14,91,364,1001,2002,3003,3432,3003,2002,1001,364,91,14,1}, {
1,15,105,455,1365,3003,5005,6435,6435,5005,3003,1365,455,105,15,1}, {
1,16,120,560,1820,4368,8008,11440,12870,11440,8008,4368,1820,560,120,16,1}, {
1,17,136,680,2380,6188,12376,19448,24310,24310,19448,12376,6188,2380,680,136,17,1}, {
1,18,153,816,3060,8568,18564,31824,43758,48620,43758,31824,18564,8568,3060,816,153,18,1}, {
1,19,171,969,3876,11628,27132,50388,75582,92378,92378,75582,50388,27132,11628,3876,969,171,19,1}, {
1,20,190,1140,4845,15504,38760,77520,125970,167960,184756,167960,125970,77520,38760,15504,4845,1140,190,20,1}, {
1,21,210,1330,5985,20349,54264,116280,203490,293930,352716,352716,293930,203490,116280,54264,20349,5985,1330,210,21,1}, {
1,22,231,1540,7315,26334,74613,170544,319770,497420,646646,705432,646646,497420,319770,170544,74613,26334,7315,1540,231,22,1}, {
1,23,253,1771,8855,33649,100947,245157,490314,817190,1144066,1352078,1352078,1144066,817190,490314,245157,100947,33649,8855,1771,253,23,1}, {
1,24,276,2024,10626,42504,134596,346104,735471,1307504,1961256,2496144,2704156,2496144,1961256,1307504,735471,346104,134596,42504,10626,2024,276,24,1}, {
1,25,300,2300,12650,53130,177100,480700,1081575,2042975,3268760,4457400,5200300,5200300,4457400,3268760,2042975,1081575,480700,177100,53130,12650,2300,300,25,1}, {
1,26,325,2600,14950,65780,230230,657800,1562275,3124550,5311735,7726160,9657700,10400600,9657700,7726160,5311735,3124550,1562275,657800,230230,65780,14950,2600,325,26,1}, {
1,27,351,2925,17550,80730,296010,888030,2220075,4686825,8436285,13037895,17383860,20058300,20058300,17383860,13037895,8436285,4686825,2220075,888030,296010,80730,17550,2925,351,27,1}, {
1,28,378,3276,20475,98280,376740,1184040,3108105,6906900,13123110,21474180,30421755,37442160,40116600,37442160,30421755,21474180,13123110,6906900,3108105,1184040,376740,98280,20475,3276,378,28,1}, {
1,29,406,3654,23751,118755,475020,1560780,4292145,10015005,20030010,34597290,51895935,67863915,77558760,77558760,67863915,51895935,34597290,20030010,10015005,4292145,1560780,475020,118755,23751,3654,406,29,1}, {
1,30,435,4060,27405,142506,593775,2035800,5852925,14307150,30045015,54627300,86493225,119759850,145422675,155117520,145422675,119759850,86493225,54627300,30045015,14307150,5852925,2035800,593775,142506,27405,4060,435,30,1}, {
1,31,465,4495,31465,169911,736281,2629575,7888725,20160075,44352165,84672315,141120525,206253075,265182525,300540195,300540195,265182525,206253075,141120525,84672315,44352165,20160075,7888725,2629575,736281,169911,31465,4495,465,31,1}, {
1,32,496,4960,35960,201376,906192,3365856,10518300,28048800,64512240,129024480,225792840,347373600,471435600,565722720,601080390,565722720,471435600,347373600,225792840,129024480,64512240,28048800,10518300,3365856,906192,201376,35960,4960,496,32,1}, {
1,33,528,5456,40920,237336,1107568,4272048,13884156,38567100,92561040,193536720,354817320,573166440,818809200,1037158320,1166803110,1166803110,1037158320,818809200,573166440,354817320,193536720,92561040,38567100,13884156,4272048,1107568,237336,40920,5456,528,33,1}};public: vector
getRow(int rowIndex) {
return pascalTriangle[rowIndex]; }};

运行效率如下:

执行用时:68 ms, 在所有 C++ 提交中击败了78.92% 的用户内存消耗:31.2 MB, 在所有 C++ 提交中击败了93.44% 的用户

Java的打表代码如下:

class Solution {
private static class pre33{
static Integer[][] list = new Integer[][]{
{
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}, {
1,9,36,84,126,126,84,36,9,1}, {
1,10,45,120,210,252,210,120,45,10,1}, {
1,11,55,165,330,462,462,330,165,55,11,1}, {
1,12,66,220,495,792,924,792,495,220,66,12,1}, {
1,13,78,286,715,1287,1716,1716,1287,715,286,78,13,1}, {
1,14,91,364,1001,2002,3003,3432,3003,2002,1001,364,91,14,1}, {
1,15,105,455,1365,3003,5005,6435,6435,5005,3003,1365,455,105,15,1}, {
1,16,120,560,1820,4368,8008,11440,12870,11440,8008,4368,1820,560,120,16,1}, {
1,17,136,680,2380,6188,12376,19448,24310,24310,19448,12376,6188,2380,680,136,17,1}, {
1,18,153,816,3060,8568,18564,31824,43758,48620,43758,31824,18564,8568,3060,816,153,18,1}, {
1,19,171,969,3876,11628,27132,50388,75582,92378,92378,75582,50388,27132,11628,3876,969,171,19,1}, {
1,20,190,1140,4845,15504,38760,77520,125970,167960,184756,167960,125970,77520,38760,15504,4845,1140,190,20,1}, {
1,21,210,1330,5985,20349,54264,116280,203490,293930,352716,352716,293930,203490,116280,54264,20349,5985,1330,210,21,1}, {
1,22,231,1540,7315,26334,74613,170544,319770,497420,646646,705432,646646,497420,319770,170544,74613,26334,7315,1540,231,22,1}, {
1,23,253,1771,8855,33649,100947,245157,490314,817190,1144066,1352078,1352078,1144066,817190,490314,245157,100947,33649,8855,1771,253,23,1}, {
1,24,276,2024,10626,42504,134596,346104,735471,1307504,1961256,2496144,2704156,2496144,1961256,1307504,735471,346104,134596,42504,10626,2024,276,24,1}, {
1,25,300,2300,12650,53130,177100,480700,1081575,2042975,3268760,4457400,5200300,5200300,4457400,3268760,2042975,1081575,480700,177100,53130,12650,2300,300,25,1}, {
1,26,325,2600,14950,65780,230230,657800,1562275,3124550,5311735,7726160,9657700,10400600,9657700,7726160,5311735,3124550,1562275,657800,230230,65780,14950,2600,325,26,1}, {
1,27,351,2925,17550,80730,296010,888030,2220075,4686825,8436285,13037895,17383860,20058300,20058300,17383860,13037895,8436285,4686825,2220075,888030,296010,80730,17550,2925,351,27,1}, {
1,28,378,3276,20475,98280,376740,1184040,3108105,6906900,13123110,21474180,30421755,37442160,40116600,37442160,30421755,21474180,13123110,6906900,3108105,1184040,376740,98280,20475,3276,378,28,1}, {
1,29,406,3654,23751,118755,475020,1560780,4292145,10015005,20030010,34597290,51895935,67863915,77558760,77558760,67863915,51895935,34597290,20030010,10015005,4292145,1560780,475020,118755,23751,3654,406,29,1}, {
1,30,435,4060,27405,142506,593775,2035800,5852925,14307150,30045015,54627300,86493225,119759850,145422675,155117520,145422675,119759850,86493225,54627300,30045015,14307150,5852925,2035800,593775,142506,27405,4060,435,30,1}, {
1,31,465,4495,31465,169911,736281,2629575,7888725,20160075,44352165,84672315,141120525,206253075,265182525,300540195,300540195,265182525,206253075,141120525,84672315,44352165,20160075,7888725,2629575,736281,169911,31465,4495,465,31,1}, {
1,32,496,4960,35960,201376,906192,3365856,10518300,28048800,64512240,129024480,225792840,347373600,471435600,565722720,601080390,565722720,471435600,347373600,225792840,129024480,64512240,28048800,10518300,3365856,906192,201376,35960,4960,496,32,1}, {
1,33,528,5456,40920,237336,1107568,4272048,13884156,38567100,92561040,193536720,354817320,573166440,818809200,1037158320,1166803110,1166803110,1037158320,818809200,573166440,354817320,193536720,92561040,38567100,13884156,4272048,1107568,237336,40920,5456,528,33,1} }; } public List
getRow(int rowIndex) {
return new ArrayList
(Arrays.asList(pre33.list[rowIndex])); }}

运行结果如下:

执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户内存消耗:36 MB, 在所有 Java 提交中击败了96.10% 的用户

解法3 组合公式

使用组合数学的知识获取杨辉三角的指定行,可以和组合公式联系起来: C ( n , i ) = n ! i ! × ( n − i ) ! C(n, i) = \frac{n!}{i ! \times (n -i)!} C(n,i)=i!×(ni)!n!

通过改变 n , i n, i n,i 的值,可以得到杨辉三角的表格:

n , i n, i n,i 0 1 2 3 4
0 1
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1

其中第 n n n 行的第 i + 1 i + 1 i+1 n ! ( i + 1 ) ! × ( n − i − 1 ) ! \frac{n!}{(i + 1)! \times (n - i - 1)!} (i+1)!×(ni1)!n! 是第 i i i n ! i ! × ( n − i ) ! \frac{n!}{i!\times (n - i)!} i!×(ni)!n! n − i i + 1 \frac{n - i}{i + 1} i+1ni 倍。由此计算出指定行的值:

class Solution {
public: vector
getRow(int rowIndex) {
vector
ans; long long cur = 1; for (int i = 0; i <= rowIndex; ++i) {
ans.push_back((int)cur); cur = cur * (rowIndex - i) / (i + 1); //必须这样写,不然可能运算错误 } return ans; }};

效率如下:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户内存消耗:6.6 MB, 在所有 C++ 提交中击败了21.29% 的用户

转载地址:https://memcpy0.blog.csdn.net/article/details/109193059 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode C++ 33. Search in Rotated Sorted Array【二分】中等
下一篇:LeetCode C++ 118. Pascal‘s Triangle【Array】简单

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年05月06日 14时35分51秒