本文共 10394 字,大约阅读时间需要 34 分钟。
Given an integer rowIndex
, return the rowIndexth
row of the Pascal’s triangle. Notice that the row index starts from 0.
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 k≤33 ,返回杨辉三角的第 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 ListgetRow(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!×(n−i)!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)!×(n−i−1)!n! 是第 i i i 项 n ! i ! × ( n − i ) ! \frac{n!}{i!\times (n - i)!} i!×(n−i)!n! 的 n − i i + 1 \frac{n - i}{i + 1} i+1n−i 倍。由此计算出指定行的值:
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!