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

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

示例 1:

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

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

给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers
最开始用的是for循环写的

int maximumProduct(int* nums, int numsSize)
{
    int i,j,t,max,a,b;
    for(i=0;i<numsSize;i++)
        for(j=i+1;j<numsSize;j++)
            if(nums[i]<nums[j])
            {
                t=nums[i];
                nums[i]=nums[j];
                nums[j]=t;
            }
      a=nums[numsSize-1]*nums[numsSize-2]*nums[0];
      b=nums[0]*nums[1]*nums[2];
      max=a>b?a:b;
      return max;
}

错误的原因是时间复杂度太长
后来尝试直接找最大、最小的方法

int maximumProduct(int* nums, int numsSize)
{
    int a,b,max;
    int max1=nums[0],max2=nums[0],max3=nums[0];
    int min1=nums[0],min2=nums[0];
    for(int i=1;i<numsSize;i++)
        if(max1<nums[i])
            max1=nums[i];
     for(int i=1;i<numsSize;i++)
        if(max2<nums[i]&&nums[i]!=max1)
            max2=nums[i];
    for(int i=1;i<numsSize;i++)
        if(max3<nums[i]&&nums[i]!=max1&&nums[i]!=max2)
            max3=nums[i];
    for(int i=1;i<numsSize;i++)
        if(min1>nums[i])
            min1=nums[i];
     for(int i=1;i<numsSize;i++)
        if(min2>nums[i]&&nums[i]!=min1)
            min2=nums[i];
     a=nums[numsSize-1]*nums[numsSize-2]*nums[0];
      b=nums[0]*nums[1]*nums[2];
      max=a>b?a:b;
      return max;
}

这次仍旧错误,原因是最大、最小的值错误。
又尝试了三个、两个一起找的方法

int maximumProduct(int* nums, int numsSize){
    int i,a,b,max1,max2,max3,min1,min2;
    max1=-1001;
    max2=-1001;
    max3=-1001;
    min1=1001;
    min2=1001;
    for (i=0;i<numsSize;i++) 
    {
        if (nums[i]> max1)
        {
            max3 = max2;
            max2 = max1;
            max1 = nums[i];
        } 
        else if (nums[i] > max2) 
        {
            max3 = max2;
            max2 = nums[i];
        } 
        else if (nums[i]> max3)
        {
            max3 = nums[i];
        }

        if (nums[i]< min1)
        {
            min2 = min1;
            min1 = nums[i];
        } 
        else if (nums[i] < min2)
        {
            min2 = nums[i];    
        }            
    }
	a=max1*max2*max3;
	b=min1*min2*max1;
	return a>b? a:b;
}

终于对了!!!
555555,算法好难,背好疼,想哭…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值