1224. 最大相等频率

2020-04-02 12:15:05

问题描述:

给出一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回其长度:

从前缀中删除一个元素后,使得所剩下的每个数字的出现次数相同。
如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是 0 次)。

示例 1:

输入:nums = [2,2,1,1,5,3,3,5]
输出:7
解释:对于长度为 7 的子数组 [2,2,1,1,5,3,3],如果我们从中删去 nums[4]=5,就可以得到 [2,2,1,1,3,3],里面每个数字都出现了两次。

示例 2:

输入:nums = [1,1,1,2,2,2,3,3,3,4,4,4,5]
输出:13

提示:

2 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

问题求解:

如果正序的来求解的话,需要讨论的情况会非常多,直接导致最后求解非常麻烦;这个时候我们需要做的更多的是从另一个角度来看待问题,往往会使问题解决变得更加简单清晰。

对于本题而言,可以反向遍历,如果当前满足条件直接返回结果即可。

如何对每一位进行判断呢?对于末尾某一位,我们可以选择删除或者保留,我们只需要针对这两种方案进行判别即可。

时间复杂度:O(n)

    int[] num2freq = new int[100001];
    int[] freq2num = new int[100001];
    public int maxEqualFreq(int[] nums) {
        int n = nums.length;
        for (int num : nums) {
            num2freq[num]++;
            freq2num[num2freq[num]]++;
        }
        for (int i = n - 1; i >= 1; i--) {
            int num = nums[i];
            // delete prev
            if (num2freq[nums[i]] * freq2num[num2freq[nums[i]]] == i) return i + 1;
            
            // delete curr
            freq2num[num2freq[num]]--;
            num2freq[num]--;
            if (num2freq[nums[i - 1]] * freq2num[num2freq[nums[i - 1]]] == i) return i + 1;
            
        }
        return 1;
    }

  

posted @ 2020-04-02 13:03  hyserendipity  阅读(298)  评论(0编辑  收藏  举报