1. 解题思路
这一题我的思路挺暴力的,就是先构造一个trie树,然后搜索对任意 n n n的最大的补数,然后考察所有结果的最大值。
然后直接的实现出现了超时的问题,因此我做了不少剪枝修补,感觉不是最好的实现方法,有兴趣的读者建议还是再想想有没有什么更好的解法吧……
2. 代码实现
给出python代码实现如下:
DIGIT_NUM = 20
class Trie:
def __init__(self):
self.trie = {}
def add(self, num):
word = bin(num)[2:].rjust(DIGIT_NUM, "0")
trie = self.trie
for c in word:
trie = trie.setdefault(c, {})
trie["eos"] = num
@lru_cache(None)
def find(self, num):
word = bin(num)[2:].rjust(DIGIT_NUM, "0")
trie = self.trie
def dfs(idx, trie):
if idx == DIGIT_NUM:
return trie.get("eos", 0)
if trie == {}:
return 0
if word[idx] == "1":
return dfs(idx+1, trie["0"]) if "0" in trie else 0
else:
return max(dfs(idx+1, trie.get("0", {})), dfs(idx+1, trie.get("1", {})))
return dfs(0, trie)
@lru_cache(None)
def get_rev(num):
num = bin(num)[2:]
digits = [1-int(x) for x in num]
ans = 0
for d in digits:
ans = 2*ans+d
return ans
class Solution:
def maxProduct(self, nums: List[int]) -> int:
snums = set(nums)
nums = list(snums)
trie = Trie()
for num in nums:
trie.add(num)
nums = sorted(nums, reverse=True)
ans = 0
for num in nums:
rev = get_rev(num)
if num * num <= ans:
break
if get_rev(num) in snums:
ans = max(ans, num * get_rev(num))
continue
ans = max(ans, num * trie.find(num))
return ans
提交代码评测得到:耗时16912ms,占用内存319.43MB。
LeetCode 3670 最大乘积问题解析
2877

被折叠的 条评论
为什么被折叠?



