您的位置:首页 > 科技 > IT业 > Leetcode 3224. Minimum Array Changes to Make Differences Equal

Leetcode 3224. Minimum Array Changes to Make Differences Equal

2025/1/8 2:19:22 来源:https://blog.csdn.net/codename_cys/article/details/140592767  浏览:    关键词:Leetcode 3224. Minimum Array Changes to Make Differences Equal
  • Leetcode 3224. Minimum Array Changes to Make Differences Equal
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3224. Minimum Array Changes to Make Differences Equal

1. 解题思路

这一题思路上还是挺巧妙的,主要就是一个累计数组的思路。

对于任意两个数 x , y x, y x,y,如果通过一次变换,那么我们能够获得的差值的区间为:
[ m a x ( 0 , m i n ( x − k , y − k ) ) , m a x ( x , y , k − x , k − y ) ] [max(0, min(x-k, y-k)), max(x, y, k-x, k-y)] [max(0,min(xk,yk)),max(x,y,kx,ky)]

而在这个区间之外,我们则需要两次操作才能够获得我们的目标差值(如果可以通过变换得到的话)。

唯一的例外就是 ∣ x − y ∣ |x-y| xy这个数,我们不需要任何操作就能够直接得到了。

因此,我们构造一个累加数组,统计一下每一个数字的pair在各个区间当中所需要的变化次数,最后累积求和一下就能够获得对应变换到各个差值下所需要的变换次数,然后我们取出其中的最小值即可。

需要注意的是,原则上我们还需要讨论一下无法变换得到的区间将其变化赋值为 ∞ \infty ,不过考虑到我们本就是要取最小值,因此这里就没有具体去讨论了。

2. 代码实现

给出python代码实现如下:

class Solution:def minChanges(self, nums: List[int], k: int) -> int:n = len(nums)m = max(max(nums), k)cnt = [0 for _ in range(m+2)]for i in range(n//2):x, y = nums[i], nums[n-1-i]diff = abs(x-y)_min = min(max(0, x-k), max(0, y-k))_max = max(x, y, k-x, k-y)cnt[_min] += 1cnt[_max+1] -= 1if _min > 0:cnt[0] += 2cnt[_min] -= 2cnt[_max+1] += 2if _min <= diff <= _max:cnt[diff] -= 1cnt[diff+1] += 1else:cnt[diff] -= 2cnt[diff+1] += 2for i in range(m+1):cnt[i+1] += cnt[i]return min(cnt)

提交代码评测得到:耗时906ms,占用内存30.9MB。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com