20190414-Leetcode-628.三个数的最大乘积

Leetcode-628.三个数的最大乘积

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6

示例 2:
输入: [1,2,3,4]
输出: 24

注意:
给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
思路:
分别定义一个大顶堆和一个小顶堆,大顶堆存放两个负数,小顶堆存放最大的三个数值。
最后比较小顶堆存放的三个数之积 与小顶堆中最大数和大顶堆两个负数的乘积的大小。
返回较大的数。注意:需要判断是否获得了两个负数。
代码:

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        priority_queue<int, vector<int>, less<int> > big_nums;
        priority_queue<int, vector<int>, greater<int> > small_nums;
        for(int i = 0; i < nums.size(); i++){
            if(i < 3){
                small_nums.push(nums[i]);
            }else{
                if(nums[i] > small_nums.top()){
                    small_nums.pop();
                    small_nums.push(nums[i]);
                }
            }
            
            if(big_nums.size() < 2 && nums[i] < 0){
                big_nums.push(nums[i]);
            }else if(nums[i] < 0 && nums[i] < big_nums.top()){
                big_nums.pop();
                big_nums.push(nums[i]);
            }
        }
        int num1 = small_nums.top();
        small_nums.pop();
        int num2 = small_nums.top();
        small_nums.pop();
        int num3 = small_nums.top();
        small_nums.pop();
        int max = num1 * num2 * num3;
        if(big_nums.size() == 2){
            int num4 = big_nums.top();
            big_nums.pop();
            int num5 = big_nums.top();
            big_nums.pop();
            int max_1 = num3 * num4 * num5;
            if(max > max_1){
                return max;
            }else{
                return max_1;
            }
        }
        return max;
        
    }
};

猜你喜欢

转载自blog.csdn.net/study_deep/article/details/89877094