首页 > 试题广场 >

三个数的最大乘积

[编程题]三个数的最大乘积
  • 热度指数:27321 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 的无序数组 ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。

要求时间复杂度: ,空间复杂度:

数据范围:


示例1

输入

[3,4,1,2]

输出

24
//先对其数组进行冒泡排序(升序排列)。
int temp=0; for (int i=0;i<in.length-1;i++)
{ for (int j=0;j<in.length-1-i;j++)
   { if (in[j] > in[j+1]) 
      { // 相邻元素两两对比  temp = in[j+1];  in[j+1] = in[j]; // 元素交换   in[j] = temp;
      }
   }
}
long negative=Math.abs(in[0])*Math.abs(in[1]);       //对最小的两个负数进行乘积 
long positiveNumber=in[in.length-2]*in[in.length-3]; //对倒数第二、第三的两个正数进行乘积 if(negative>positiveNumber)
{ return negative*in[in.length-1];  //最后乘以数组最后一个元素(最大的数) } else { return positiveNumber*in[in.length-1]; }

发表于 2021-10-22 20:35:01 回复(0)
long long solve(int* A, int ALen) {
        // write code here
        int min1 = INT_MAX, min2 = INT_MAX;
        // 最大的、第二大的和第三大的
        int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;

        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);

    }

发表于 2021-01-22 13:51:51 回复(0)
不想用这种方法 但是想不出别的方法 
只有两种可能 要不就是三正 要不就是两负一正
function solve( A ) {
    // write code here
    let len = A.length-1
    A.sort((a,b)=>a-b)
    let A1 = A[0]*A[1]*A[len]
    let A2 = A[len]*A[len-1]*A[len-2]
    return Math.max(A1,A2)
}


发表于 2020-12-24 16:12:57 回复(1)
解题思路:遍历数组,找到最大的三个数和最小的两个数,三个数的最大乘积来源可能有两种,一种是三个最大的数相乘,另一种是两个最小的数和一个最大的数相乘
import java.util.*;
public class Solution {
    /**
     * 最大乘积
     * @param A int整型一维数组 
     * @return long长整型
     */
    public long solve (int[] A) {
        // write code here
        int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
        int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
        for(int num:A){
            if(num>max1){
                max3=max2;
                max2=max1;
                max1=num;
            } else if(num>max2){
                max3=max2;
                max2=num;
            } else if(num>max3) max3=num;
            if(num<min1){
                min2=min1;
                min1=num;
            } else if(num<min2) min2=num;
        }
        return Math.max((long)max1*max2*max3,(long)max1*min1*min2);
    }
}


发表于 2021-03-20 13:28:20 回复(0)
做题都不看要求??
发表于 2021-01-21 14:27:43 回复(0)
#
# 最大乘积
# @param A int整型一维数组 
# @return long长整型
#
class Solution:
    def solve(self , A ):
        # write code here
#         先排序。取整数最大的三个积,或者最大两个负数以及最大正数积
        A.sort()
        return max(A[-1]*A[-2]*A[-3], A[0]*A[1]*A[-1])
发表于 2021-07-23 22:59:27 回复(0)
这最后一个用例是不是有问题,输入
[-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000]
答案竟然是-1000000000000
发表于 2021-11-07 17:39:24 回复(3)
Java 设置5个变量含义依次为:第一大的数,第二大的数,第三大的数,第一小的数,第二小的数
```java
public class Solution {
    /**
     * 最大乘积
     * @param A int整型一维数组 
     * @return long长整型
     */
    public long solve (int[] A) {
          int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
        int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
        for(int num:A){
            if(num>max1){
                max3=max2;
                max2=max1;
                max1=num;
            } else if(num>max2){
                max3=max2;
                max2=num;
            } else if(num>max3) max3=num;
            if(num<min1){
                min2=min1;
                min1=num;
            } else if(num<min2) min2=num;
        }
        return Math.max((long)max1*max2*max3,(long)max1*min1*min2);
    }
}

```
发表于 2020-09-29 10:47:40 回复(0)
Java题解,使用BigInteger,强行算出来比较大小
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class T_57 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a[] = {3472,7789,7955,-7098,-9281,6101,5051,7778,3090,7423,-7151,5652,1595,-8094,677,-8324,8347,-2482,9313,-9338,-3157,8559,6945,3618,3087,121,-8468,3225,1356,6939,2799,-7231,-6309,-5453,633,-8689,-4776,2714,-2743,-1409,5918,-3333,1803,8330,-2206,-6117,-4486,-7903,-4375,-3739,2897,8056,-5864,-522,7451,-4541,-2813,5790,-532,-6517,925};
		System.out.println(solve(a));
	}
	public static BigInteger solve (int[] A) {
		int n = A.length;
		if(n<3)
			return new BigInteger("0");
		Arrays.sort(A);
        // 比较这两个位置的大小即可
		BigInteger a = new BigInteger(A[n-1]+"");
		BigInteger b = new BigInteger(A[n-2]+"");
		BigInteger c = new BigInteger(A[n-3]+"");
		BigInteger d = new BigInteger(A[0]+"");
		BigInteger e = new BigInteger(A[1]+"");
		BigInteger r1 = a.multiply(b).multiply(c);
		BigInteger r2 = d.multiply(e).multiply(a);
		if(r1.compareTo(r2)>=0)
                    // 转成long类型
			return r1.longValueExact();
		else
			return r2.longValueExact();
    }
}

发表于 2020-09-16 16:22:17 回复(0)
最大乘积只有两种可能,一种是三个都是最大的正数,第二种是两个数是最小的负数,一个是正数,(如果元素都是负数就按都是正数处理)

一 : 要求事件复杂度为 O(n),因此可以跟踪 5 个变量,分别表示最大值,第二大值,第三大值,最小值,第二小值,代码如下
O(n) 复杂度:

  public long solve(int[] A) {
        // 初始化所需的最大和最小值
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE,
            max3 = Integer.MIN_VALUE;
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;

        // 遍历数组,找出前三个最大值和前两个最小值
        for (int num : A) {
            // 更新最大值
            if (num > max1) {
                max3 = max2;
                max2 = max1;
                max1 = num;
            } else if (num > max2) {
                max3 = max2;
                max2 = num;
            } else if (num > max3) {
                max3 = num;
            }

            // 更新最小值
            if (num < min1) {
                min2 = min1;
                min1 = num;
            } else if (num < min2) {
                min2 = num;
            }
        }

        // 计算两种可能的最大乘积,并返回其中的较大值
        return Math.max((long) max1 * max2 * max3, (long) min1 * min2 * max1);
    }

二: 如果不要求时间复杂度,直接使用贪心算法最简单, java 默认的排序(双轴快速排序),然后直接计算结果:
 public long solve(int[] A) {
        // write code here
        Arrays.sort(A);
        return Math.max( ((long) A[A.length - 1] * A[A.length - 2] * A[A.length - 3]),(long)  A[0] * A[1] *  A[A.length - 1]);
    }

  
发表于 2024-06-17 13:45:21 回复(0)
class Solution:
    def solve(self , A: List[int]) -> int:
        # write code here
        A = sorted(A,reverse=True)
        ans1 =  A[0] * A[1] * A[2] # 前三个数
        ans2 = A[0] * A[-1] * A[-2]  #从大到小排序后,最后两个是负数的情况
        return max(ans1, ans2)
编辑于 2024-04-22 22:04:35 回复(0)
import java.util.*;


public class Solution {
    /**
     * 最大乘积
     * @param A int整型一维数组 
     * @return long长整型
     */
    public long solve (int[] A) {
        // write code here
        Arrays.sort(A);//排序,排序后取最小两个数和最大数的乘积与三个最大数相比取大者返回
        long a=A[A.length-1];
        long b=A[A.length-2];
        long c=A[A.length-3];
        long d=A[0];
        long e=A[1];
        if(a*b*c>a*d*e)
        return a*b*c;
        else
            return a*d*e;
    }
}

发表于 2022-04-14 14:35:18 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 最大乘积
 * @param A int整型一维数组
 * @return long长整型
 */
function solve(A) {
    //三个数的最大乘积有两种可能
    //1.三个最大的数相乘
    //2.两个最小的数(负数)和一个最大的正数相乘
    if (A.length < 3) return 0;

    // 初始化最大和最小值
    let max1 = -Infinity,
        max2 = -Infinity,
        max3 = -Infinity; // 三个最大的数
    let min1 = Infinity,
        min2 = Infinity; // 两个最小的数

    for (let num of A) {
        // 更新最大值
        if (num > max1) {
            max3 = max2;
            max2 = max1;
            max1 = num;
        } else if (num > max2) {
            max3 = max2;
            max2 = num;
        } else if (num > max3) {
            max3 = num;
        }

        // 更新最小值
        if (num < min1) {
            min2 = min1;
            min1 = num;
        } else if (num < min2) {
            min2 = num;
        }
    }

    // 计算两种可能的最大乘积
    const res1 = max1 * max2 * max3; // 三个最大值的乘积
    const res2 = min1 * min2 * max1; // 两个最小值和一个最大值的乘积

    // 返回较大的乘积
    return Math.max(res1, res2);
}
module.exports = {
    solve: solve,
};

发表于 2024-11-09 00:29:07 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最大乘积
     * @param A int整型一维数组
     * @return long长整型
     */
    public long solve (int[] A) {
        // write code here
        Arrays.sort(A);
        return Math.max((long)A[0] * (long)A[1] * (long)A[A.length - 1],
                        (long)A[A.length - 3] * (long)A[A.length - 2] * (long)A[A.length - 1]);
    }
}

发表于 2024-10-22 15:37:37 回复(0)
牛客编译器有毒啊 !!!三数直接相乘显示溢出,换为其中两个数相乘之后再乘另外一个数结果正确。 数据类型没错,这里是什么原因???
发表于 2024-08-23 10:51:13 回复(0)
    public long solve (int[] A) {
        // write code here
        int len=A.length;
        Arrays.sort(A);
        return Math.max((long)A[len-1]*A[len-2]*A[len-3] ,(long)A[len-1]*A[0]*A[1]);
    }

编辑于 2024-03-24 14:44:23 回复(0)
 public long solve (int[] A) {
        // write code here
        //全正:最后三个相乘
        //全负:最后三个相乘
        //有正有负:要么是最后三个相乘,要么是第1个元素*第二个元素*最后一个元素
        Arrays.sort(A);
        int num = A.length;
        long end1 = (long)A[num - 1] * A[num - 2] * A[num - 3];
        long end2 = (long)A[0]*A[1]*A[num-1];
        long max = Math.max(end1,end2);
        return max;
    }

编辑于 2024-03-04 19:11:29 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最大乘积
     * @param A int整型一维数组 
     * @return long长整型
     */
    public long solve (int[] A) {
        // write code here
        // 两种情况:2 负 + 1 正 -> 最小的两个数 + 最大数
        // 3 正 最大的三个数
        Arrays.sort(A);
        long max = Long.MIN_VALUE;
        if(A[1] < 0) {
            max = Math.max((long)A[1] * (long)A[0] * (long)A[A.length - 1], max);
        } 
        max = Math.max((long)A[A.length - 1] * (long)A[A.length - 2] * (long)A[A.length - 3], max);
        return max;
    }
}

发表于 2024-02-05 21:30:16 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最大乘积
     * @param A int整型一维数组
     * @return long长整型
     */
    public long solve (int[] A) {
        Arrays.sort(A);
        long min1=A[0],min2=A[1];
        int length=A.length;
        long max1=A[length-1],max2=A[length-2],max3=A[length-3];
        return min1*min2*max1 > max1*max2*max3 ? min1*min2*max1 : max1*max2*max3;
    }
}

发表于 2023-10-08 11:01:16 回复(0)
为什么总会报错这个
发表于 2023-03-23 16:04:12 回复(2)

问题信息

上传者:牛客332641号
难度:
84条回答 5422浏览

热门推荐

通过挑战的用户

查看代码
三个数的最大乘积