1. 解题思路
这一题是题目3264. Final Array State After K Multiplication Operations I的进阶版本。
他的基础逻辑还是按照题目3264,即直接维护一个有序数列然后逐次操作一下即可:
class Solution:
def getFinalState(self, nums: List[int], k: int, multiplier: int) -> List[int]:
q = [(x, i) for i, x in enumerate(nums)]
heapq.heapify(q)
for _ in range(k):
x, i = heapq.heappop(q)
heapq.heappush(q, (x*multiplier, i))
ans = deepcopy(nums)
for x, i in q:
ans[i] = x
return ans
但是对于进阶版的题目3266,k
和multiplier
都可能会很大,因此我们不但无法直接使用for
循环循环k
,也无法一直保持乘法,必须在中间进行持续同余的操作,避免中间结果过大。
但是可以预想的是,显然经过了若干次操作之后,我们会得到一个序列,满足最小的元素进行一次乘法操作之后得到的新元素必然大于最大的元素,此时这些元素的相对大小也就被保留下来了,用上述有序数列来说的话就是每次操作都会是第一个操作乘完之后变成了最后一个元素。
此时,剩余的k
次乘法操作就会被均匀分配到所有的n
个数上面,此时我们就可以快速的得到每一个元素的最终值为
x
i
×
m
⌊
k
n
⌋
x_i \times m^{\lfloor\frac{k}{n}\rfloor}
xi×m⌊nk⌋了。(注意一下余数的问题,即头部哪些元素可能会多进行若干次操作)。
而剩下的我们只需要通过python内置的pow
函数即可快速实现了。
2. 代码实现
给出最终的python代码实现如下:
MOD = 10**9+7
class Solution:
def getFinalState(self, nums: List[int], k: int, multiplier: int) -> List[int]:
if multiplier == 1:
return nums
n = len(nums)
q = [(x, i) for i, x in enumerate(nums)]
_max = max(nums)
heapq.heapify(q)
while k > 0:
x, i = heapq.heappop(q)
y = x * multiplier
heapq.heappush(q, (y, i))
k -= 1
if y > _max:
break
m, r = k // n, k % n
q = sorted(q)
ans = deepcopy(nums)
for i, (x, idx) in enumerate(q):
if i < r:
ans[idx] = (x * pow(multiplier, m+1, MOD)) % MOD
else:
ans[idx] = (x * pow(multiplier, m, MOD)) % MOD
return ans
提交代码评测得到:耗时501ms,占用内存19.4MB。