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; }