三个数的最大乘积[线性扫描]

这篇博客探讨了如何在不进行排序的情况下,通过线性扫描找到数组中三个数的最大乘积。作者提出了两种方法:一种是直接排序后取特定位置的数相乘;另一种是动态维护最大值、次大值、最小值和次小值,避免了排序的时间复杂度。这两种方法都针对数组中数字的正负情况进行了优化,旨在提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1.排序

思路:

1.三个数都是整数或者都是负数:那么就排序,取大的前三个
2.两负一正:取排序后倒数两个负数,和取排序最大那个数相乘
3.两正一负:直接像第一种那样取前三大

public static int sortMethod(int[] array){
        Arrays.sort(array);
        int n = array.length;
        //就是两种情况而已
        return Math.max(array[0]*array[1]*array[n-1],array[n-1]*array[n-2]*array[n-3]);
    }

2. 线性扫描(重点)

(还不太懂2021/8/19)

由于排序的时间复杂度一般都是N*logn,比较高,所以我们就不用排序,而是分析上面的,发现我们只需要用到上面的5个数就行:array[0]*array[1]*array[n-1],array[n-1]*array[n-2]*array[n-3],那我们就从这5个数下手:

 public static int getMaxMin(int[] array){
        //这里因为我们要判断每个数是否>或小,所以min1=Integer.MAX_VALUE就反过来,不是字面意思
        //min1是最小,min2是倒数第二小
        //max1是最大,max2是第二大
        int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
        int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;

        for (int x : array) {
            if (x<min1){
                min2=min1;
                min1=x;
            }else if (x<min2){
                min2=x;
            }

            if (x>max1){
                max3=max2;
                max2=max1;
                max1=x;
            }else if (x>max2){
                max3=max2;
                max2=x;
            }else if(x>max3){
                max3=x;
            }
        }
        return Math.max(min1*min2*max1,max1*max2*max3);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值