leetcode 241. 为运算表达式设计优先级
题目描述
给你一个由数字和运算符组成的字符串 expression
,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。
生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过 104
。
示例 1:
输入:expression = "2-1-1" 输出:[0,2] 解释: ((2-1)-1) = 0 (2-(1-1)) = 2
示例 2:
输入:expression = "2*3-4*5" 输出:[-34,-14,-10,-10,10] 解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
提示:
1 <= expression.length <= 20
expression
由数字和算符'+'
、'-'
和'*'
组成。- 输入表达式中的所有整数值在范围
[0, 99]
题解——分治+记搜
思路
分治
对于一个算式来说,总是可以根据运算符分为两部分,接着分别计算结果并合并
每一个结果都是一个数组,包含这个算式的所有可能结果,计算时将左右两部分排列组合
递归的终点是字符串是纯数字,直接返回
比如示例中的2*3-4*5
,有下面的分法
- 分为
2
与3-4*5
,对于3-4*5
,继续细分3-4*5
可以分为3
与4*5
,或者3-4
与5
,所以结果为{-17,-5}
- 则这种分法产生的最终结果就是
{-34,-10}
- 分为
2*3
与4*5
,这种分法产生的结果就是{-14}
- 分为
2*3-4
与5
,对于2-3*4
,继续细分2*3-4
可以分为2
与3-4
,或者2*3
与4
,所以结果为{-2,2}
- 则这种分法产生的最终结果就是
{-10,10}
最终结果是它们的结合,也就是{-34,-10,-14,-10,10}
,本题是不需要我们去重的
不论是多复杂的算式,总是可以不断分而治之,递归得到各个部分的解
记搜
由于数据量比较小,这道题不用记搜也能过,大概在4ms左右,用了记搜能提升到0ms
还是考虑上面的例子,在第一种分法里,我们已经计算过了4*5
,但是在第二种分法里,我们又算了一遍
为了减少重复计算,用哈希表作备忘录,保存算式到结果的映射,每次计算时查表/存表
代码
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HeRen's Blog!
评论