NC106 三个数的最大乘积(数组)

描述

给定一个长度为 nn 的无序数组 AA ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。
输入:[3,4,1,2]
返回值:24
要求时间复杂度: O(n),空间复杂度: O(1)。

解题思路

遍历数组,找到最大的三个数和最小的两个数,三个数的最大乘积来源可能有两种,一种是三个最大的数相乘,另一种是两个最小的数和一个最大的数相乘

class Solution {
public:

    long long solve(int* A, int ALen) {
        int max1=INT_MIN,max2=INT_MIN,max3=INT_MIN;//最大的,第二大的,第三大的
        int min1=INT_MAX,min2=INT_MAX;//最小的,第二小的(负数要用)
        for(int i=0;i<ALen;i++){
            if(A[i]<min1){
                min2=min1;
                min1=A[i];
            }else if(A[i]<min2){
                min2=A[i];
            }
            if(A[i]>max1){
                max3=max2;
                max2=max1;
                max1=A[i];
            }else if(A[i]>max2){
                max3=max2;
                max2=A[i];
            }else if(A[i]>max3){
                max3=A[i];
            }
           
        }
        return max((long long)min1*min2*max1,(long long)max1*max2*max3);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值