问题在于selection algorithm
选择总和至少为某个值 N 的最少项目数的变化。例如,您可能想要一个总和为 5,000 或更多的项目列表,但您不想要更多的项目您必须从输入列表中获取。因此,如果一个数字是 5,001,那么您的输出列表将包含一个数字。
另一个例子:Input list {3,4,5,1,2} target = {8}.
output list will be : {5,3}
。
这个问题已经binaryHeap
在这个优秀的系列文章中被证明可以解决;但是当我实现时Java
,我没有得到想要的输出。我得到了整个input list
. 我无法找出问题的确切原因。这是我的代码;
public class SelectTopSum {
public static void main(String[] args){
int[] arr = {5,2,10,1,33};
int target=33;
System.out.println(Arrays.toString(selectTop(arr, target)));
}
private static int[] selectTop(int[] arr, int sum) {
//get max heap
PriorityQueue<Integer> pq = new PriorityQueue<>(10, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
int runningTot=0;
for (int i : arr) {
if (runningTot<sum) {
runningTot+=i;
pq.add(i);
}
else if (i > pq.peek()) {
runningTot-=pq.remove();
runningTot+=i;
pq.add(i);
}
while (runningTot-pq.peek()>=sum) {
runningTot-=pq.remove();
}
}
//System.out.println("priority queue is "+ pq);
int[] result=new int[pq.size()];
int i=0;
while (!pq.isEmpty()) {
result[i]=pq.remove();
i++;
}
return result;
}
}