思路:
1.对数组进行排序并取得数组的总和
2.从大到小对数组进行筛选
3.只要有一种可行方案即返回True
class Solution(object):
def canPartition(self, nums):
if len(nums) <= 1:
return False
sum1 = sum(nums)
nums.sort()
#若数组中最大值大于数组总和值的一半,则直接返回False
if sum1 % 2 == 1 or nums[-1] > (sum1 >> 1):
return False
def rec(nums, size, val):
if val == 0:
return True
yes = False
#遍历搜索各种可能的组合
for i in range(size - 1, -1, -1):
if nums[i] <= val:
yes |= rec(nums[0:i] + nums[i + 1:], size - 1, val - nums[i])
if yes:
return True
return yes
#因为要将数组分为等值的两部分,所以传入数组总和的一半值
return rec(nums, len(nums), sum1 >> 1)
不加中文注释时的代码效率: