【力扣】891.子序列宽度之和
题目描述

思路分析
朴素思路(超时)
- 通过回溯找到所有可能性,然后求解
- 套用回溯模板求解
- 此题范围过大,肯定超时
1 | const int MOD = 1e9 + 7; |
数学
考虑到宽度的定义为序列中最大值和最小值的差值,因此可以考虑每个数字对于最终结果的贡献
- 当数字作为最大值时,为正向贡献
- 当数字作为最小值时,为负向贡献
- 只需要计算出有多少种可能性即可
既然只需要关心数组nums中数字的大小而不需要关心它所在的位置了,所以先排序,方便进行计算可能性

排序之后,我们随便找一个下标为
i的元素,可以找到以下规律- 作为最大值:因为除下标为$i$的元素必选外,其余元素共$i$个(0和1),每个位置有两种可能性(选或者不选),因此结果为$2^i$
- 作为最大值:因为除下标为$i$的元素必选外,其余元素$n - i - 1$(3,4,6,7),每个位置有两种可能性(选或者不选),因此结果为$2^{n - i - 1}$

以
nums[i]和其左侧所有元素拼装组合成的子序列示例:
最终贡献即为两者之和
以上图片来自参考1
1 | const int MOD = 1e9 + 7; |

参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 cv-programmer!







