在接受采访时被问及我无法提出解决方案。场景是有一系列权重(某些项目)。选择项目的成本为 1 。现在,如果你选择重量项 w ,你可以将范围[w,w + 4] 中的所有项目视为免费。算法的工作是实现最低成本并选择所有项目。
我的方法是拥有一个最大堆并遍历数组,并且在遍历数组时计算可以通过获取当前项目而免费获得的项目数,并使用max heap来选择免费获得最大项目的项目。面试官说好了,但要求我提供更好的解决方案,因为遍历部分本身花费 O(n ^ 2)。
具体示例
Weights array: 1 2 3 17 10
Minimum cost 3: I pick 1, get 2 and 3 for free and then pick both 17 and 10
答案 0 :(得分:0)
不确定它是否正确解决方案,但如果您对列表/数组进行排序,则可以遍历列表以查找范围[w,w + 4]中的最大子列表。从列表大小和最低费用中减去此值。
它将花费你O(NlogN),而最昂贵的操作将是排序
List<Integer> list = Arrays.asList(1 ,2, 3,2, 17, 10);
Collections.sort(list);//O(logN*N)
int a=0,b=0;
do {
if (list.get(b+1)-list.get(a)<4){
b++;
}else{
a++;
b++;
}
}while(b<list.size()-1);
int minCost = list.size()-(b-a);
System.out.println(minCost);
这只是一个例子,可能有更好的解决方案