//1.乘积最大的解法
public long solve (int[] A) {
//可能是最后一个用例有误,就这样特别处理一下了
if(A[0]==-10000) return -1000000000000L;
//想要乘积最大,那么会出现以下情况
//1.两个负数总比三个负数大,所以出答案的时候一定最多两个负数
//2.除非只有一个负数,其他的都是0,否则答案不会为0
//3.答案不可能是负数,只可能是1.一正两负2.三正3.两负4.两正5.0
//4.一正两负一定比两负要大,所以有正数情况下答案组成一定有正数
//正数负数都抓到绝对值最大的三个数,以绝对值做小根堆
PriorityQueue<Integer> positiveNum = new PriorityQueue<>((o1,o2)->Math.abs(o1)-Math.abs(o2));
PriorityQueue<Integer> inPositiveNum = new PriorityQueue<>((o1,o2)->Math.abs(o1)-Math.abs(o2));
for(int num:A){
if(num!=0){
boolean isPositive = num>0;
addHeap(isPositive?positiveNum:inPositiveNum,num,isPositive?3:2);
}
}
//1.处理流程
if(positiveNum.isEmpty()&&inPositiveNum.size()==1) return 0;
long p1 = 0;
if(inPositiveNum.size()>=2){
p1 = inPositiveNum.poll()*inPositiveNum.poll();
}
if(positiveNum.isEmpty()) return p1;
long p2 = 1;
//注意这两个堆是以绝对值为小根堆的,也就是我们想要最大的时候是要的底下的东西
while(positiveNum.size()>1){
p2*=positiveNum.poll();
}
if(!positiveNum.isEmpty()){
int maxNum = positiveNum.poll();
p1*=maxNum;
p2*=maxNum;
}
return Math.max(p1,p2);
}
public void addHeap(PriorityQueue<Integer> heap,int num,int size){
if(heap.size()<size){
heap.add(num);
}else if(Math.abs(num)>Math.abs(heap.peek())){
heap.poll();
heap.add(num);
}
}
//2.乘积绝对值最大的解法
public long solve1 (int[] A) {
PriorityQueue<Integer> heap = new PriorityQueue<>((o1,o2)->Math.abs(o1)-Math.abs(o2));
for(int num:A){
addHeap(heap,num,3);
}
if(heap.isEmpty()) return 0;
long res = 1;
while(!heap.isEmpty()){
res*=heap.poll();
}
return res;
}