标签:递归、动态规划、分治--归并排序
563. 二叉树的坡度
这个题题干挺绕的,需要好好理解只后再开始做题;思路很简单,求出每个节点左右子树的和,再把所有节点的坡度算出来累加即可。关键点在于这个步骤怎么优化,迭代的话可以使用一个hashmap作为memo,key是节点,value是节点下的所有节点的累加和,减少重复计算;递归是更加合理的方式,只需在递归求和的过程中,顺便累加坡度就能得到答案
剑指 Offer 60. n个骰子的点数
动态规划;dp[i][j] 表示i+1个骰子,出现数值j+1的概率; 因此dp[i][j] = dp[i-1][0]*dp[0][j-1] + dp[i-1][1]*dp[0][j-2]+...
举例说明: 注意此处为了解释方便,将dp下标与骰子个数以及和数值统一;实际写代码时要注意
3个骰子和为15的概率为 dp[2][14]*dp[1][1]+dp[2][13]*dp[1][2]+...+dp[2][2]*dp[1][13]+dp[2][1]*dp[1][14];
注意因为2个骰子的时候骰子和不可能为14、13,因此此概率为0; 对于1个骰子过大的数也是一样的情况,因此最终能得到正确的概率
但此处其实有大量的无效计算,真正起作用的概率对于1个骰子而言只有1-6,因此此处可以成为上述优化的地方
dp[i][j] = dp[i-1][j-1]*dp[0][1] + dp[i-1][j-2]*dp[0][2]+dp[i-1][j-3]*dp[0][3]+dp[i-1][j-4]*dp[0][4]+dp[i-1][j-5]*dp[0][5]+dp[i-1][j-6]*dp[0][6]
这样就从每个值(n-1)*(n-1)降低到(n-1)*6; 此操作能将leetcode上的案例从1ms降低到0ms
剑指 Offer 51. 数组中的逆序对
这个题的思路如果没接触过真的很难想到,现总结为:
逆序对 -> 排序 -> 几种常用的排序算法中,稳定的排序算法 -> 归并排序