阵列/范围选择

时间:2014-11-19 15:56:36

标签: java arrays algorithm

在接受采访时被问及我无法提出解决方案。场景是有一系列权重(某些项目)。选择项目的成本为 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 

1 个答案:

答案 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);

这只是一个例子,可能有更好的解决方案