假设我们有一个正整数的数组num,我们必须返回给定数组num的数组前缀的最大可能长度,这样就可以从该前缀中精确删除一个元素,以便其中出现的每个数字都会具有相同的频率。如果没有剩余元素,则删除一个元素后,仍会认为每个出现的数字具有相同的频率。
因此,如果输入类似于[3,3,2,2,6,4,4,6],则输出将为7,因此,如果我们从索引4中删除元素6,则子数组将为[3, [3,2,2,4,4],其中所有元素出现两次。
为了解决这个问题,我们将遵循以下步骤-
maxf:= 0,res:= 0
定义映射cnt和freq
对于初始化i:= 0,当i <nums大小时,更新(将i增加1),执行-
分辨率:= i + 1
x:= nums [i]
(将cnt [x]增加1)
f:= cnt [x]
(将freq [f]增加1)
将freq [f-1]减少1
maxf:= maxf和f的最大值
如果maxf * freq [maxf]与i相同或(maxf-1)*(freq [maxf-1] + 1)与i相同或maxf与1相同,则-
返回资源
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxEqualFreq(vector<int>& nums) { int maxf = 0, res = 0; map<int, int> cnt, freq; for (int i = 0; i < nums.size(); i++) { int x = nums[i]; cnt[x]++; int f = cnt[x]; freq[f]++; freq[f - 1]--; maxf = max(maxf, f); if (maxf * freq[maxf] == i || (maxf - 1) * (freq[maxf - 1] + 1) == i || maxf == 1) { res = i + 1; } } return res; } }; main(){ Solution ob; vector<int> v = {3,3,2,2,6,4,4,6}; cout << (ob.maxEqualFreq(v)); }
{3,3,2,2,6,4,4,6}
输出结果
7
本文向大家介绍在C ++中执行给定操作后,数组中最大数目的相等数,包括了在C ++中执行给定操作后,数组中最大数目的相等数的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目标是在执行给定操作后找到数组中等于的最大数- 选择两个元素a [i]和a [j],使i!= j和 递增a [i]并递减a [j](a [i] ++,a [j]-) 我们将取数组的总和除以元素数。如果N是数组的大小,
我在一次采访中被问到这个问题。给定一个整数数组(具有正值和负值),我们需要找到具有相等总和的不相交子数组的最大数量。 例子: 输入:[1,2,3]输出:2{因为我们最多有2个子数组,总和=3,即[1,2],[3]} 输入: [2 2 2 -2] 输出 : 2 {两个子数组,每个子数组的总和 = 2,即 [2],[2, 2, -2]} 我的方法 我想到的第一种方法是找到前缀和数组,然后以每个元素(前
本文向大家介绍LCM的最大长度子数组等于C ++中的乘积,包括了LCM的最大长度子数组等于C ++中的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到子数组的最大长度,它的LCM与该子数组元素的乘积相同。如果找不到这种子数组,则返回-1。假设数组为{6,10,21},则长度为2,因为在那里有子数组{10,21},其LCM为210,乘积也为210。 该方法是直接的。我
本文向大家介绍C ++中的最大擦除值,包括了C ++中的最大擦除值的使用技巧和注意事项,需要的朋友参考一下 给定正整数数组,任务是擦除包含所有唯一元素的子数组。擦除子数组所得到的结果等于其元素的总和。 通过删除当前子数组之前或之后的项来返回当前子数组的最大和,我们可以通过仅删除一个子数组来获得最大和。 阵列ARR 被称为是一个子阵列一个如果它形成的连续子序列一个即如果它等于一个[1],A [L +
本文向大家介绍在C ++中生成相同总和的对的最大数量,包括了在C ++中生成相同总和的对的最大数量的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目的是在数组中找到最大对数,相加后将产生相同的总和。我们必须找到此类对的最大数量。 输入值 输出结果 说明-数字对的总和- 输入值 输出结果 说明-数字对的总和- 以下程序中使用的方法如下 整数数组Arr []用于存储整数。 整数“大小”存
此示例代码是否在所有系统上导致两个相等的值?