本文主要是介绍Leetcode 2968. Apply Operations to Maximize Frequency Score,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- Leetcode 2968. Apply Operations to Maximize Frequency Score
- 1. 解题思路
- 2. 代码实现
- 题目链接:2968. Apply Operations to Maximize Frequency Score
1. 解题思路
这题说来惭愧,一开始自己没有搞定,不过看了大佬们的解答之后发现多少有点安慰,因为某种意义上来说,感觉也算是个知识点题目,知道了就很快,不知道的话就比较折腾了……
我一开始的思路的话就是滑动窗口,控制左右还有中间的target位置进行单向滑动,从而在 O ( N ) O(N) O(N)的时间复杂度内获得题目的答案。
不过这里的单向滑动的处理方式上没能想明白,主要难点在于中间target位置的选取上,没有想的很明白,无法确定移动方式确保不会出现来回摇摆的情况。
然后,看了大佬们的解答之后发现,这里事实上有一个非常浅显但是重要的结论:
- 对于任何一组有序数组,永远是取中间值作为目标时可以使得 ∑ i = 1 n ∣ x i − x 0 ∣ \sum\limits_{i=1}^{n}|x_i - x_0| i=1∑n∣xi−x0∣达到最小值。
这个数学问题的证明事实上也不复杂,移动一个位置考察结果的变化关系即可快速得到结论。
因此,上述问题就只需要考察左右边界的单向滑动,而这个就比较简单了。
2. 代码实现
给出python代码实现如下:
class Solution:def maxFrequencyScore(self, nums: List[int], k: int) -> int:nums = sorted(nums)sums = list(accumulate(nums, initial=0))ans = 0l, r, n = 0, 0, len(nums)while l < n:while r < n:m = (l+r) // 2cost = (m-l) * nums[m] - (sums[m]-sums[l]) + (sums[r+1]-sums[m+1]) - (r-m) * nums[m]if cost > k:breakans = max(ans, r-l+1)r += 1l += 1return ans
提交代码评测得到:耗时971ms,占用内存31.4MB。
这篇关于Leetcode 2968. Apply Operations to Maximize Frequency Score的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!