Java 阵列/范围选择

Java 阵列/范围选择,java,arrays,algorithm,Java,Arrays,Algorithm,这是在一次采访中被问到的,我没能想出一个解决办法。该场景是(某些项目)有一个权重数组。选择项目的成本为1。现在,如果您选择重量w的物品,您可以免费获得范围[w,w+4]内的所有物品。该算法的任务是实现最小成本并选择所有项目 我的方法是拥有一个最大堆并遍历数组,在遍历数组时,通过拾取当前项目计算可以免费获得的项目数,并使用最大堆拾取可以免费获取最大项目的项目。面试官说可以,但要求我提供更好的解决方案,因为穿越部分本身成本O(n^2) 具体例子 Weights array: 1 2 3 17 10

这是在一次采访中被问到的,我没能想出一个解决办法。该场景是(某些项目)有一个权重数组。选择项目的成本为1。现在,如果您选择重量w的物品,您可以免费获得范围[w,w+4]内的所有物品。该算法的任务是实现最小成本并选择所有项目

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

不确定这是不是正确的解决方案,但如果您对列表/数组进行排序,您可以遍历列表以找到[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);
List List=Arrays.asList(1,2,3,2,17,10);
集合。排序(列表)//O(logN*N)
int a=0,b=0;
做{
if(list.get(b+1)-list.get(a)