均衡数组

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:一个整数数组

输入格式

第一行包含一个整数,即 arr 中的元素数量。
下一行包含 n 个用空格分隔的整数 arr[ i ]。

约束

  • 1 <= n < = 100
  • 1 <= arr[i] < = 100

 

输出格式

打印一个整数,表示为了使数组相等而必须删除的最少元素数量。

示例输入

示例输出

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] 中的任意数组相等,需要删除两个元素。