鱼儿慢慢游~~

导航

 

题目描述:

Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +, - and *.


Example 1

Input: "2-1-1".

((2-1)-1) = 0
(2-(1-1)) = 2

Output: [0, 2]


Example 2

Input: "2*3-4*5"

(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

Output: [-34, -14, -10, -10, 10]

大概意思是,给定一个表达式,通过加括号的方法,输出不同计算顺序产生的计算结果。 在题目下方提示中显示使用分治法解题。

解题思路: 将输入的表达式根据运算符分割为左表达式和右表达式。 分别计算左右表达式的值,然后合并出结果,如2*3-4*5 ,首先以第一个*号分割,左边表达式的值为2,右边表达式为3-4*5, 递归计算出右边表达式的所有值,为(-17,-5) 并与左边做乘法,得到(-34, -10),然后以第二个运算符分割

算法缺点: 在递归过程中,会出现大量的重复计算。如上例, 在计算- 号时,右边表达式4*5在第一次以*分割时,以经计算过了。这里可以采用额外的空间进行记录,不再研究。

代码如下:

 1 class Solution(object):
 2     def diffWaysToCompute(self, input):
 3         """
 4         :type input: str
 5         :rtype: List[int]
 6         """
 7         res = []
 8         l = len(input)
 9         for i in range(0, l):
10             if input[i] == '+' or input[i] == '-' or input[i] == '*':
11                 left = self.diffWaysToCompute(input[:i])  #左边表达式
12                 right = self.diffWaysToCompute(input[i+1:]) #右边表达式
13                 for j in left:
14                     for k in right:
15                         if input[i] == '+':
16                             res.append(j + k)
17                         elif input[i] == '-':
18                             res.append(j - k)
19                         else:
20                             res.append(j * k)
21         if res == []:  #递归结束
22             res.append(int(input))
23         return res

 

 

另一道相似的题目为:

Unique Binary Search Trees II

题目描述:

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

 即给定一个n,写出从1到n所有的可能的二叉查找树。之前 的计算出从1到n的二叉树的个数。见http://www.cnblogs.com/missmzt/p/5525798.html

解题思路: 1.同样采用分治法,从1到n n个数,根节点依次为: 1, 2,... i..n

     2. 当根节点取值为i时,  这时其左子树的取值为1~i-1 右子树的取值为: i+1 ~n

     3. 针对左右子树的取值,依次递归。 注意当节点i的左子树或右子树为空时,设置其子树为none

如 输入3 时, 需要写出 1, 2, 3 的二叉查找树, 当1 为根节点时, 其 左子树为空,右子树取值为: 2~3, 我们使用start 和end 来表示每次递归”根“节点的取值范围

代码如下:

 1 class Solution(object):
 2     def generateTrees(self, n):
 3         """
 4         :type n: int
 5         :rtype: List[TreeNode]
 6         """
 7         return self.getTree(1, n)
 8             
 9     def getTree(self, s, e):
10         ret = []
11         for i in range (s, e+1):
12             l = self.getTree(s, i-1)
13             r = self.getTree(i+1, e)
14             for x in (l if len(l) else [None]):  #左子树里面的每一颗子树分别作为其左子树, 如3为根节点时,分别为1, 和 2
15                 for y in (r if len(r) else [None]):
16                     head = TreeNode(i)
17                     head.left = x
18                     head.right = y
19                     ret.append(head)
20         return ret

 

posted on 2016-06-02 10:34  miss_UU  阅读(245)  评论(0编辑  收藏  举报