1、首先,最笨的方法就是按照#118算完后取出相应行。
2、但是,根据二项式定理,我们可以知道,这实际上就是求每一项的系数,此时,可以利用公式递推计算
当然,我们非常容易想到,n>=33,简单计算便知道超了,因此用64位。
class Solution {
public:
vector<int> getRow(int rowIndex) {
if(rowIndex == 0)
return {1};
vector<int> row(rowIndex+1);
row[0] = 1;
for (int i = 1; i <= rowIndex; i++) {
long long temp = row[i-1] * (rowIndex - i + 1) / i;
row[i] = temp;
}
return row;
}
};
问题来了:(1)、连续计算将错误已经溢出的结果赋给,64位。
(2)、除法只能最后算,否则必定取整导致出错。
for (int i = 1; i <= rowIndex; i++) {
long long temp = row[i-1];
temp *= (rowIndex - i + 1);
temp /= i;
row[i] = temp;
}
除此之外,这里要注意两点:赋值时左边的计算与右边没有关系!同时乘除优先满足有符号数
(1)、
unsigned long long temp = row[i - 1] * (rowIndex - i + 1);
赋值时按照32位乘,同时按照有符号数的处理cdq
00CE7228 imul edx,dword ptr [eax]
00CE722B mov eax,edx
00CE722D cdq
00CE722E mov dword ptr [ebp-3Ch],eax
00CE7231 mov dword ptr [ebp-38h],edx
temp /= i;
尽管我们需要得到无符号,仍依照i采取有符号填充,因此实际上是利用无符号的64位除法__aulldiv()
计算了一个完成补码扩充的数!必然错误
0CE7238 push edx
00CE7239 push eax
00CE723A mov eax,dword ptr [ebp-38h]
00CE723D push eax
00CE723E mov ecx,dword ptr [ebp-3Ch]
00CE7241 push ecx
00CE7242 call __aulldiv (0CE197Eh)
00CE7247 mov dword ptr [ebp-3Ch],eax
00CE724A mov dword ptr [ebp-38h],edx
因此,必须统一符号、计算与赋值分离