求数组中三个数的最大乘积(C++(易学习区))

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

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

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

#include<limits.h>
C/C++中常量INT_MAX和INT_MIN分别表示最大、最小整数,头文件是limits.h。

INT_MAX = 2^31-1=2147483647;

INT_MIN= -2^31=-2147483648;

时间复杂度取决于排序:O(nlogn)

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
      
     
      //先对这个数组排序
      sort(nums.begin(),nums.end());
      int a,b;
      // int a = INT_MIN, b = INT_MIN;有时候这样写!
      //如果前两位都小于0
      if(nums[0]<0 && nums[1]<0)
      {
          a=nums[0]*nums[1]*nums[nums.size()-1];
      }
      //注意这里不是else,因为不管如何都要算b
          //如果只有一位小于0,或者都不小于0,
          b=nums[nums.size()-1]*nums[nums.size()-2]*nums[nums.size()-3];
          
      return max(a,b);
    }
};


C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法。两者的时间复杂度都是nlogn,但是实际应用中,sort()一般要快些,建议使用sort()。

先写到这里,明天补充!

第二种方法是,找到三个最大值和两个最小值进行比较

class Solution {
public:

    int maximumProduct(vector<int>& nums) {
        
        //三个最大值,初值定义为最小整数
        int max1 = INT_MIN;
        int max2 = INT_MIN;
        int max3 = INT_MIN;

        //两个最小值,初值定义为最大整数
        int min1 = INT_MAX;
        int min2 = INT_MAX;

        for(int a:nums)//记得定义a
        {
            if(a>max1)
            {
                max3 = max2;
                max2 = max1;
                max1 = a;
            }else if(a>max2)
            {
               max3 = max2;
               max2 = a; 
            }else if(a>max3)
            {
                max3 = a;
            }

             if(a<min1)
            {
                min2 = min1;
                min1 = a;
            }else if(a<min2)
            {
                min2 = a;
            }
        }       
        return max(max1*max2*max3, min2*min1*max1);
    }
};

突然想到,这种方法是不是可以用到上一道题(求倒数第三个最大的数)里面,结果试了下不太行,因为这一个题是让求最大乘积,那么遇到相同的数字都可以被包含到那里面,而上一题不能有重复,重复的话就必须舍弃掉。

修改了很多次的失败品(针对上一题):

class Solution {
public:
    int thirdMax(vector<int>& nums) {

      
        //三个最大值,初值定义为最小整数
        int max1 = INT_MIN;
        int max2 = INT_MIN;
        int max3 = INT_MIN;

        //两个最小值,初值定义为最大整数
        int min1 = INT_MAX;
        int min2 = INT_MAX;

        for(int a:nums)//记得定义a
        {
            if(a>max1 )
            {
                max3 = max2;
                max2 = max1;
                max1 = a;
            }else if(a>max2 && a !=max1)
            {
               max3 = max2;
               max2 = a; 
            }else if(a>max3 && a !=max1)
            {
                max3 = a;
            }

             if(a<min1 )
            {
                min2 = min1;
                min1 = a;
            }else if(a<min2 && a!=min1)
            {
                min2 = a;
            }
        }
        if(min1==max2) return max1;
        if( nums[0]==nums[1] &&  nums[1]==nums[2]  ) return nums[0];
        return max3;


    }
};
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值