【问题标题】:Array/range selection数组/范围选择
【发布时间】:2015-01-17 05:32:17
【问题描述】:

这是在一次采访中被问到的,我无法提出解决方案。场景是(某些项目的)权重数组。选择一个项目的成本是1。现在,如果您选择重量为 w 的物品,您将免费获得 range[w, w+4] 内的所有物品。该算法的工作是实现最低成本并挑选所有物品。

我的方法是有一个最大堆并遍历数组,并在遍历数组时计算可以通过拾取当前项目免费获得的项目数量,并使用最大堆来选择保证免费提供最大项目的项目.面试官说OK,但问我更好的解决方案,因为遍历部分本身成本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 

【问题讨论】:

    标签: java arrays algorithm


    【解决方案1】:

    不确定这是不是正确的解决方案,但如果您对列表/数组进行排序,您可以遍历列表以找到范围 [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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多