Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

最高频元素的频数 #248

Open
louzhedong opened this issue Apr 26, 2021 · 0 comments
Open

最高频元素的频数 #248

louzhedong opened this issue Apr 26, 2021 · 0 comments

Comments

@louzhedong
Copy link
Owner

习题

元素的 频数 是该元素在一个数组中出现的次数。

给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。

执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。

示例 1:

输入:nums = [1,2,4], k = 5
输出:3
解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。
4 是数组中最高频元素,频数是 3 。
示例 2:

输入:nums = [1,4,8,13], k = 5
输出:2
解释:存在多种最优解决方案:

  • 对第一个元素执行 3 次递增操作,此时 nums = [4,4,8,13] 。4 是数组中最高频元素,频数是 2 。
  • 对第二个元素执行 4 次递增操作,此时 nums = [1,8,8,13] 。8 是数组中最高频元素,频数是 2 。
  • 对第三个元素执行 5 次递增操作,此时 nums = [1,4,13,13] 。13 是数组中最高频元素,频数是 2 。
    示例 3:

输入:nums = [3,9,6], k = 2
输出:1

提示:

1 <= nums.length <= 105
1 <= nums[i] <= 105
1 <= k <= 105

思路

看到题目,第一步就是对元素进行排序

第一种思路是暴力破解,针对每个元素,往前回溯N个,只要这N个与该元素差的和小于k即可。但这样会超时

第二种思路是采用双指针的思路,限定需要遍历的元素的范围。初始是只有前两个元素,每次右指针移动一格,计算范围内所有值与右指针所对应的值的差之和。如果小于,则继续右移。如果大于,左指针右移一格

解答

javascript

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var maxFrequency = function(nums, k) {
    nums.sort(function(a, b) {
        return a - b;
    });
    var leftPtr = 0,
    total = 0,
    res = 1;
    for (var rightPtr = 1, length = nums.length; rightPtr < length; rightPtr++) {
        total += (nums[rightPtr] - nums[rightPtr - 1]) * (rightPtr - leftPtr);
        while(total > k) {
            total -= (nums[rightPtr] - nums[leftPtr]);
            leftPtr++;
        }

        res = Math.max(rightPtr - leftPtr + 1, res);
    }
    return res;
};

go

import (
    "sort"
)
func maxFrequency(nums []int, k int) int {
    sort.Ints(nums)
    leftPtr := 0
    total := 0
    res := 1

    for rightPtr := 1; rightPtr < len(nums); rightPtr++ {
        total += (nums[rightPtr] - nums[rightPtr - 1]) * (rightPtr - leftPtr)
        for total > k {
            total -= (nums[rightPtr] - nums[leftPtr])
            leftPtr++
        }
        if (rightPtr - leftPtr + 1) > res {
            res = rightPtr - leftPtr + 1
        }
    }

    return res
 }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant