我正在尝试解决这个问题。有什么想法吗?
编写函数
class Solution { public int solution(int[] T); }
在给定N个整数的数组T(代表所有类型的糖果)的情况下,返回给我N / 2个糖果给我的兄弟后,我可以吃的不同类型糖果的最大可能数量。
例如,给定
T= [3,4,7,7,6,6]
该函数应该返回3。对我来说,一种最佳策略是放弃一种类型4的糖果,一种类型7的糖果和一种类型6的糖果。其余的糖果将是[3,7,6]:
三种不同类型的糖果。
给出:
T = [80, 80, 1000000000, 80, 80, 80, 80, 80, 80, 123456789]
该函数还应该返回3。在这里,我从10个糖果开始。我可以赠送5个类型8的糖果,其余的糖果将为[1000000000, 123456789, 80, 80, 80]
。总共只有三种不同的类型,即80、1000000000和123456789。
针对以下假设编写有效的算法:
N是[2..100,000];
范围内的整数
N是偶数
数组T的每个元素都是[1..1,000,000,000]
范围内的整数。
答案 0 :(得分:1)
我将为您提供解决方案的设计。您仍然必须设计细节(例如确定内部数据结构等)并编写解决方案的代码。您可以在进行时对设计/代码提出具体问题。
主要要点是:您要放弃最大数量的糖果类型。这将使您拥有最多的类型。
因此,首先,您要计算每种类型出现的次数。您可以通过对输入参数进行一次传递来实现。您将需要一个内部集合来保存结果。一旦有了,就可以按出现次数对集合进行排序。
现在,您从最高数量的类型开始对已排序的集合进行迭代。每次以数量1(这样您就给自己留下1个这种类型的糖果)作为您给兄弟的数量。并移至集合中的下一个条目,将数量减1直到达到所需的N / 2数字。