笛卡尔乘积,去掉i==j
就是所有可能配对
for i in range(len(nums)):
for j in range(len(nums)):
if i!=j:
print((i,j))
那么我们只要任选一组做±*/四种操作的一种
'''
选取除了(nums[i], nums[j])之外的数字组成列表
'''
leftChoices = [ x[k] for k in range(len(nums)) if k!=j!=i ]
'''
新的列表就是:
'''
[nums[i]+nums[j]] + leftchoices
[nums[i]-nums[j]] + leftchoices
[nums[i]*nums[j]] + leftchoices
[nums[i]/nums[j]] + leftchoices
'''
注意了,i,j如果互换位置,那么其实第一个和第三个式子不会变化,因此可以随意限制搜索的时候,i>j 或者 i<j都可以
然后,除法要注意,除数不能为0,因此要加上,nums[j]!=0
现在nums变成了只有三个元素的列表,然后递归调用。
'''
'''
完整代码
'''
class solution()
def judge24Point(self, nums):
if len(nums)==0:
return False
def helper(nums):
#递归出口
if len(nums)==1:
return abs(nums[0]-24)<1e-7
for i in range(len(nums)):
for j in range(len(nums)):
if i!=j:
left = [x[k] for k in range(len(nums)) if k!=j!=i]
if i>j and helper(left + [nums[i]+nums[j]]):return True
if i>j and helper(left + [nums[i]*nums[j]]):return True
if helper(left + [nums[i]-nums[j]]): return True
if nums[j]>0 and helper(left + [nums[i]/nums[j]]):return True
return False
return helper(nums)