Leetcode 3266. Final Array State After K Multiplication Operations II

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

但是对于进阶版的题目3266kmultiplier都可能会很大,因此我们不但无法直接使用for循环循环k,也无法一直保持乘法,必须在中间进行持续同余的操作,避免中间结果过大。

但是可以预想的是,显然经过了若干次操作之后,我们会得到一个序列,满足最小的元素进行一次乘法操作之后得到的新元素必然大于最大的元素,此时这些元素的相对大小也就被保留下来了,用上述有序数列来说的话就是每次操作都会是第一个操作乘完之后变成了最后一个元素。

此时,剩余的k次乘法操作就会被均匀分配到所有的n个数上面,此时我们就可以快速的得到每一个元素的最终值为 x i × m ⌊ k n ⌋ x_i \times m^{\lfloor\frac{k}{n}\rfloor} xi×mnk了。(注意一下余数的问题,即头部哪些元素可能会多进行若干次操作)。

而剩下的我们只需要通过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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值