几个星期前做了一道“伪动态规划”的题目杨辉三角一,现在来试试位于它下面的那道题目(二)
同样地,动画做得很好,只是我微薄的算法技巧配不上这么优秀的动画了,呜呜呜~。
以下是代码。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
/*以上是LeetCode刷题面板自带的注释,因为下面要返回我们自己的数组,所以必须去堆里申请空间,
如果在栈里申请一段连续的空间作为数组的话在return之前会被回收*/
int* getRow(int rowIndex, int* returnSize){
*returnSize = rowIndex+1; //观察图片和例子不难发现,第几行它的个数就是行数+1,然后直接赋值就好
int *result[rowIndex+1];
//因为我们是动态规划,所以我们在优化前必须要“升高维度”,要求我们返回一个一位数组,我们就得申请一个二维数组
for(int i=0;i<rowIndex+1;i++)
{
result[i] = (int *)malloc(sizeof(int)*(i+1)); //我们只需要返回的那段数组从堆里申请就好了,所以二维数组的指针可以从栈中获取
//以下是动态规划的两个初始条件:从图中可以看到,我们最左边和最后边的数肯定是0.
result[i][0] = 1;
result[i][i] = 1;
//以下是dp表达式,和之前的差不多,上面相邻两项之和。
for(int j=1;j<i;j++)
{
result[i][j] = result[i-1][j-1]+result[i-1][j];
}
}
//最好返回的时候要注意了,我写的时候[rowIndex]这个东西给忘了,结果一直还找不到错在哪儿了。哈哈,其实要求返回一行(一位数组)啦。
return result[rowIndex];
}
其实吧,在CSDN写一遍过程和注释对算法的学习帮助会更大(让思路更清晰),毕竟像我这样不太聪明的人,学算法确实有点困难,坚持下去吧。
以下是Python的做法和解析:
class Solution:
def getRow(self, rowIndex):
result = [[1],[1,1]] #和上次的类似,为了提高效率,前两种情况就手动写好了
if rowIndex == 0:
return result[0]
elif rowIndex==1:
return result[1]
else:
for i in range(2,rowIndex+2):
temp = [1,1]
for j in range(i-2):
temp.insert(j+1,result[i-1][j]+result[i-1][j+1]) #dp表达式和之前差不多
result.append(temp) #把产生的新列表添加到末尾
return result[rowIndex+1]
class Solution:
def getRow(self, rowIndex):
result = [[1],[1,1]]
if rowIndex == 0:
return result[0]
elif rowIndex==1:
return result[1]
else:
for i in range(2,rowIndex+2):
temp = [1,1]
for j in range(i-2):
temp.insert(j+1,result[i-1][j]+result[i-1][j+1])
result.append(temp)
return result[-1]
如果最后直接用索引-1的话,牺牲时间换空间,不太值得。