题解 | #三个数的最大乘积#

三个数的最大乘积

http://www.nowcoder.com/practice/8ae05c2913fe438b8b14f3968f64fc0b

	//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;
    }
waigo的刷题之路 文章被收录于专栏

收录平时刷题的题解

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务