执行操作可获得的最大总奖励 II
给你一个整数数组 rewardValues,长度为 n,代表奖励的值。
最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i。
以整数形式返回执行最优操作能够获得的 最大 总奖励。
class Solution:
def maxTotalReward(self, rewardValues: List[int]) -> int:
m = max(rewardValues)
s = set()
for v in rewardValues:
if v in s:
continue
if v == m - 1 or m - 1 - v in s:
return m * 2 - 1
s.add(v)
f = 1
for v in sorted(s):
f |= (f & ((1 << v) - 1)) << v
return f.bit_length() - 1
解题思路:
如果有两个不同元素之和等于 m−1,也可以直接返回 2m−1。
由于在随机数据下,几乎 100% 的概率有两数之和等于 m−1,而力扣又喜欢出随机数据,所以在大多数情况下,本题就是一道 1. 两数之和。