首页 > 试题广场 >

三个数的最大乘积

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

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

数据范围:


示例1

输入

[3,4,1,2]

输出

24
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 最大乘积
 * @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)
/**
 * 最大乘积
 * @param A int整型一维数组 
 * @return long长整型
 */
function solve( A ) {
    // write code here
    if(A.length<3){return 0}
    let arr = A.sort((a,b)=>{return a-b})
    return Math.max(arr[A.length-1]*arr[A.length-2]*arr[A.length-3],arr[0]*arr[1]*arr[A.length-1])
}
module.exports = {
    solve : solve
};
发表于 2022-02-21 17:01:14 回复(0)
/**
 * 最大乘积
 * @param A int整型一维数组 
 * @return long长整型
 */
function solve( A ) {
    // write code here
    A.sort((a,b)=>a-b);
    console.log(A);
    
    let len = A.length;
    //前两个+最后一个
    let n = A[0]*A[1]*A[len-1];
    //最后三个
    let m=A[len-3]*A[len-2]*A[len-1];
    
    return Math.max(n,m);
}
module.exports = {
    solve : solve
};

发表于 2021-11-16 21:12:21 回复(0)
// 分析场景, 最终的结果,  大于等于0 或者负数  ; 大于等于0 的场景, 三正或者 两负一正, 负数的场景  两正一负或者 三负,

function solve( A ) {
       // write code here
   const aa = [];
   const bb = [];
   let res = 1;
   A.forEach(i=>{
       if(i>= 0){
          aa.push(i) 
       } else {
           bb.push(i)
       }
   })
    sortArr(aa).reverse();
    const absBB = sortArr(bb.map(i=>Math.abs(i)));
    let maxV = aa[0];
    //  三正
    if(aa.length >= 3 ){
        const [o,t,e] = aa;
       res = o* t*e;
    }
    // 两负一正 
    if(bb.length >1 && aa.length > 1) {
       const mo = [...absBB].reverse();
       const [minA,minB] = mo;

       if((minA* minB* maxV) > res ) {
           res = minA* minB* maxV
       }
        
    }
    // 三负
    if(bb.length >2 && aa.length === 0){
        const fs = absBB;
         const [mina,minb, minc] = fs;
          res =  -(mina*minb* minc);
    }
    // 两正一负
    if(bb.length === 1 && aa.length === 2){
       res = bb[0] * aa[1]*aa[0]
        
    }
   return res
}
function sortArr(arr) {
    arr.sort((a,b)=>{
        return a-b;
    });
    return arr;
}

// 传统的思路, 遍历比大小,这种情况处理数据量大时,会超时

function solve( A ) {
    // write code here
    let maxVal = null;
  for(let i= 0; i< A.length; i++){
      const twoArr = A.slice(i+1);
      for(let j = 0; j< twoArr.length; j++){
           const threeArr = twoArr.slice(j+1);
           for(let z = 0; z< threeArr.length; z++){
               const curVal = A[i] * twoArr[j] * threeArr[z];
               if(maxVal <curVal || (i==0 && j===0 && z==0) ){
                   maxVal = curVal 
               }

           }
      }
  }
  return maxVal

发表于 2021-11-03 10:38:19 回复(0)
function solve( A ) {
    // write code here
    A = A.sort((a,b)=>a-b)
    return A[A.length-1]*A[A.length-2]*A[A.length-3]>A[A.length-1]*A[0]*A[1]?A[A.length-1]*A[A.length-2]*A[A.length-3]:A[A.length-1]*A[0]*A[1]
}
🤔笨办法
发表于 2021-09-25 20:28:46 回复(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)

问题信息

上传者:牛客332641号
难度:
7条回答 5426浏览

热门推荐

通过挑战的用户

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