【java】628. Maximum Product of Three Numbers

问题原文点击打开链接

先对这道题进行排序,然后排序前三的整数相乘。但是要考虑两种特殊情况,第一是数组里面包含负整数的情况,第二种是前三里面包含0的情况。分开讨论问题就很简单了。

public void intiHeap(int[] nums,int length,int parent){
        int val = nums[parent];
        int child = 2*parent+1;
        while( child < length){
            if (child+1 < length && nums[child+1]<nums[child]) child++;

            if (val<nums[child]) break;

            nums[parent] = nums[child];
             parent = child;
             child = 2*parent+1;
        }
        nums[parent] = val;
    }
    public void sort(int[] nums){
        for (int i = nums.length/2;i >= 0;i--){
            intiHeap(nums,nums.length,i);
        }
        

        for (int i = nums.length-1;i>=0;i--){
            int tmp = nums[0];
            nums[0] = nums[i];
            nums[i] = tmp;
            intiHeap(nums,i,0);
        }
    }
    public int maximumProduct(int[] nums) {
        sort(nums);
        int startPos = -1;
        int endPos = -1;
        //记录第一个0出现的位置
        for (int i = 0;i<nums.length;i++){
            if (nums[i] == 0) {
                startPos = i;
                break;
            }
        }
        //记录最后一个0出现的位置
        for (int  i = nums.length-1;i>=0;i--){
            endPos = i;
            break;
        }
        if (startPos <= 2 && startPos >0){
            if (endPos+2<nums.length){
                return nums[0]*nums[nums.length-1]*nums[nums.length-2];
            }else{
                return 0 ;
            }
        }
                //记录下第一个负数出现的位置
        int negExit = -1;
        for (int i = 0;i<nums.length;i++){
            if (nums[i]<0){
                negExit = i;
                break;
            }
        }
        if (negExit>-1 && negExit+1<nums.length){
            return nums[0]*nums[1]*nums[2]>nums[0]*nums[nums.length-1]*nums[nums.length-2]?
                    nums[0]*nums[1]*nums[2]:nums[0]*nums[nums.length-1]*nums[nums.length-2];
        }
        return nums[0]*nums[1]*nums[2];
    }

猜你喜欢

转载自blog.csdn.net/amber804105/article/details/80966013