[Lintcode]739. 24 Game/[Leetcode]679. 24 Game

[Lintcode]739. 24 Game/[Leetcode]679. 24 Game

本题难度: Hard/Medium

Description

You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated through *, /, +, -, (, ) to get the value of 24.

Example 1:

Input: [4, 1, 8, 7]
Output: True
Explanation: (8-4) * (7-1) = 24

Example 2:

Input: [1, 2, 1, 2]
Output: False

Note:

The division operator / represents real division, not integer division. For example, 4 / (1 - 2/3) = 12.
Every operation done is between two numbers. In particular, we cannot use - as a unary operator. For example, with [1, 1, 1, 1] as input, the expression -1 - 1 - 1 - 1 is not allowed.
You cannot concatenate numbers together. For example, if the input is [1, 2, 1, 2], we cannot write this as 12 + 12.

我的代码


import sys
class Solution:
    
    def judgePoint24(self, nums: List[int]) -> bool:
        def cal(a,b):
            if a == 0:
                return b,-b,0
            if b == 0:
                return a,-a,0
            return list({a+b,a-b,b-a,a*b,a/b,b/a})
        stack = [[float(item) for item in nums]]
        while (len(stack) > 0):
            tmp_nums = stack.pop()
            if len(tmp_nums) == 1:
                if abs(tmp_nums[0] - 24.0) <= 0.0001:
                    return True
                continue
            l = len(tmp_nums)
            for n1 in range(l - 1):
                for n2 in range(n1 + 1,l):
                    tmp_cals = cal(tmp_nums[n1],tmp_nums[n2])
                    for tmp_cal in tmp_cals:
                        tmp_res = [tmp_cal] + tmp_nums[:n1] + tmp_nums[n1 + 1:n2] + tmp_nums[n2 + 1:]
                        stack.append(tmp_res)
        return False               
                

posted @ 2019-07-15 22:17  siriusli  阅读(110)  评论(0编辑  收藏  举报