均衡数组2025年1月12日 | 阅读 6 分钟 问题陈述Karl 有一个整数数组。他想缩减数组,直到所有剩余的元素都相等。确定达到目标的最小删除次数。 例如,如果他的数组是 arr = [ 1, 2, 2, 3 ],我们可以看到他可以删除元素 1 和 3,留下 arr = [ 2, 2 ]。他也可以删除两个 2,以及 1 或 3,但这将需要 3 次删除。最少删除次数是 2。 函数描述 在下面的编辑器中完成 *equalize Array* 函数。它必须返回一个表示最少删除次数的整数。 equalize Array 具有以下参数:
输入格式 第一行包含一个整数,即 arr 中的元素数量。 约束
输出格式 打印一个整数,表示为了使数组相等而必须删除的最少元素数量。 示例输入 示例输出 2 说明 数组 arr[ 3, 3, 2, 1, 3 ]。如果我们删除 arr[ 2 ] = 2 和 arr[ 3 ] = 1,则结果数组 A' = [ 3, 3, 3 ] 中的所有元素都将相等。删除这两个元素是最小的。我们仅有的其他选择是删除 4 个元素以获得一个包含 [ 1 ] 或 [ 2 ] 的数组。 上述问题的 C 语言代码对上述代码的解释如果我们考虑 n=5 的值; 声明并初始化变量 n、i、j、c1 = 1、c2 = 1、a[100] 输入数组(n)的元素数量。设 n = 5 for(i = 0; i < n; i++) { scanf(" %d ", &a[i]); } 使用上述 for 循环将值插入到数组 a 中,该数组有 n 个元素,插入后数组 a 包含以下元素:a[3, 3, 2, 1, 3]。 外层 for 循环将从 0 循环到 4。 for i = 0 C1 = 1 内层 for 循环将从 1 循环到 4,for j = 1 if(a[i] == a[j]) 求值为 TRUE,因为 i = 0 & j = 1 且数组 a[3, 3, 2, 1, 3] C1++ => C1 = 2 for j = 2 if(a[i] == a[j]) 求值为 FALSE,因为 i = 0 & j = 2 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 for j = 3 if(a[i] == a[j]) 求值为 FALSE,因为 i = 0 & j = 3 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 for j = 4 if(a[i] == a[j]) 求值为 TRUE,因为 i = 0 & j = 4 且数组 a[3, 3, 2, 1, 3] C1++ => C1 = 3。现在 j 循环将终止 if(c1 > c2) 求值为 TRUE,因为 C1 = 3 且 C2 = 1 C2 = C1 => C2 = 3 for i = 1 C1 = 1 内层 for 循环将从 2 循环到 4,for j = 2 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 2 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 for j = 3 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 3 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 for j = 4 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 4 且数组 a[3, 3, 2, 1, 3] C1++ => C1 = 2 if(c1 > c2) 求值为 FALSE,因为 C1 = 2 且 C2 = 3 C2 = C1 => 不会执行 for i = 2 C1 = 1 内层 for 循环将从 3 循环到 4,for j = 3 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 2 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 for j = 4 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 3 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 if(c1 > c2) 求值为 TRUE,因为 C1 = 1 且 C2 = 3 C2 = C1 => 不会执行 for i = 3 C1 = 1 内层 for 循环将从 4 循环到 4,for j = 4 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 2 且数组 a[3, 3, 2, 1, 3] C1++ => 不会执行 if(c1 > c2) 求值为 FALSE,因为 C1 = 1 且 C2 = 3 C2 = C1 => 不会执行 for i = 4 C1 = 1 内层循环将不执行,因为 5 < 4 为 FALSE if(c1 > c2) 求值为 FALSE,因为 C1 = 1 且 C2 = 3 C2 = C1 => 不会执行 printf(" %d ", n - c2); 将打印 2,因为 C2 = 3 且 n 的值为 5,这表明要使数组 a[3, 3, 2, 1, 3] 中的任意数组相等,需要删除两个元素。 如果我们考虑 n=4 的值; 声明并初始化变量 n、i、j、c1 = 1、c2 = 1、a[100] 输入数组(n)的元素数量。设 n = 4 for(i = 0; i < n; i++) { scanf(" %d ", &a[i]); } 使用上述 for 循环将值插入到数组 a 中,该数组有 n 个元素,插入后数组 a 包含以下元素:a[1, 2, 2, 3]。 外层 for 循环将从 0 循环到 3。 for i = 0 C1 = 1 内层 for 循环将从 1 循环到 3,for j = 1 if(a[i] == a[j]) 求值为 FALSE,因为 i = 0 & j = 1 且数组 a[1, 2, 2, 3] C1++ => 不会执行 for j = 2 if(a[i] == a[j]) 求值为 FALSE,因为 i = 0 & j = 2 且数组 a[1, 2, 2, 3] C1++ => 不会执行 for j = 3 if(a[i] == a[j]) 求值为 FALSE,因为 i = 0 & j = 3 且数组 a[1, 2, 2, 3] C1++ => 不会执行,现在 j 循环将终止 if(c1 > c2) 求值为 FALSE C2 = C1 => 不会执行 for i = 1 C1 = 1 内层 for 循环将从 2 循环到 3,for j = 2 if(a[i] == a[j]) 求值为 TRUE,因为 i = 1 & j = 2 且数组 [1, 2, 2, 3] C1++ => C1 = 2 for j = 3 if(a[i] == a[j]) 求值为 FALSE,因为 i = 1 & j = 3 且数组 a[1, 2, 2, 3] C1++ => 不会执行,现在 j 循环将终止 if(c1 > c2) 求值为 TRUE,因为 C1 = 2 且 C2 = 1 C2 = C1 => C2 = 2 for i = 2 C1 = 1 内层 for 循环将从 3 循环到 3,for j = 3 f(a[i] == a[j]) 求值为 FALSE,因为 i = 2 & j = 3 且数组 a[1, 2, 2, 3] C1++ => 不会执行 for i = 3 C1 = 1 内层循环将不执行。 if(c1 > c2) 求值为 FALSE,因为 C1 = 1 且 C2 = 2 C2 = C1 => 不会执行 printf(" %d ", n - c2); 将打印 2,因为 C2 = 2 且 n 的值为 4,这表明要使数组 a[3, 3, 2, 1, 3] 中的任意数组相等,需要删除两个元素。 下一主题如何存储数组中的值 |
我们请求您订阅我们的新闻通讯以获取最新更新。