分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +
, -
以及 *
。
示例 1:
输入:"2-1-1"
输出:[0, 2]
解释: ((2-1)-1) = 0 (2-(1-1)) = 2
示例 2:
输入:"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
class Solution(object): def diffWaysToCompute(self, input): """ :type input: str :rtype: List[int] """ def dfs(s, cache) : ops = {'+':lambda x,y:x+y, '-':lambda x,y:x-y, '*':lambda x,y:x*y} if not cache.has_key(s) : ret = [] for k, v in enumerate(s) : if v in '+-*' : for left in dfs(s[:k], cache) : for right in dfs(s[k+1:], cache) : ret.append(ops[v](left,right)) if not ret : ret.append(int(s)) cache[s] = ret return cache[s] return dfs(input, {})
分治算法解决的经典问题:
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)快速排序
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表
(10) 汉诺塔问题