题目:原题链接(困难)
标签:分治算法
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( 2 N 2 l o g ( 2 N 2 ) ) O(2^\frac{N}{2}log(2^\frac{N}{2})) O(22Nlog(22N)) | O ( 2 N 2 ) O(2^{\frac{N}{2}}) O(22N) | 2800ms (56.40%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
# 枚举所有可能的组合
def enumeration(nums):
size = len(nums)
ans = [0 for _ in range(1 << size)] # 2**n种可能
for i in range(size):
for j in range(1 << i):
ans[(1 << i) + j] = nums[i] + ans[j]
return ans
class Solution:
def minAbsDifference(self, nums: List[int], goal: int) -> int:
# 切分数组并枚举所有可能
size = len(nums)
part1 = enumeration(nums[:size // 2])
part2 = enumeration(nums[size // 2:])
# 排序所有可能
part1.sort()
part2.sort()
ans = abs(goal)
i, j = 0, len(part2) - 1
while i < len(part1) and j >= 0:
now = part1[i] + part2[j]
ans = min(ans, abs(now - goal))
# 贪心的策略
if now > goal: # 超了,大的就小一点
j -= 1
elif now < goal: # 小了,小的就大一点
i += 1
else: # 相等了,直接就是0了
return 0
return ans