首页 > 试题广场 >

最大乘积

[编程题]最大乘积
  • 热度指数:119926 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:
输入共2行,第一行包括一个整数n,表示数组长度
第二行为n个以空格隔开的整数,分别为A1,A2, … ,An


输出描述:
满足条件的最大乘积
示例1

输入

4
3 4 1 2

输出

24
public static void main(String[] args) {
        PDD1();
    }
    public static void PDD1(){
        long sum = 1;
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        List<Long> arrayList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            arrayList.add(scanner.nextLong());
        }
        arrayList.sort((o1, o2) -> {
            Long tmp = o2-o1;
            return tmp.intValue();
        }
        );
        if (arrayList.get(1)*arrayList.get(2)<arrayList.get(arrayList.size()-1)*arrayList.get(arrayList.size()-2)){
            sum = arrayList.get(0)*arrayList.get(arrayList.size()-1)*arrayList.get(arrayList.size()-2);
        }else {
            sum = arrayList.get(0)*arrayList.get(1)*arrayList.get(2);
        }
        System.out.println(sum);
    }

发表于 2022-01-26 22:28:46 回复(0)
提交结果:答案错误 运行时间:124ms 占用内存:21160KB 使用语言:Java 用例通过率:22.22%。
我代码什么问题?我本地运行没问题呀。第一行输入长度,第二行输入的数据并用空格隔开,结果对呀。为啥说我答案错误?


import java.util.Arrays;
import java.util.Scanner;

public class Main{

        public static void main(String[] args){
            Scanner scanner=new Scanner(System.in);
            int n = scanner.nextInt();
            int[] array = new int[n];
            for (int i = 0; i <n ; i++) {
                array[i] = scanner.nextInt();
            }
            max(array);
        }

        private static void max(int[] arr){
            //从小到大排序
            Arrays.sort(arr);
            int f=0;
            for(int a: arr){
                if(a<0){
                    f++;
                }
            }
            int fm=0;
            int zm=0;
            if(f>=2){
                //最大的正数乘最小的俩个负数,得到一个最大值
                fm=arr[arr.length-1]*arr[0]*arr[1];
            }
            zm=arr[arr.length-1]*arr[arr.length-2]*arr[arr.length-3];
            if(fm>zm){
                zm=fm;
            }
            System.out.println(zm);
        }
}

发表于 2020-11-18 10:44:20 回复(0)
找到最大的三个数和最小的两个数即可。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * @Author: coderjjp
 * @Date: 2020-05-13 11:46
 * @Description: 最大乘积
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] line2 = br.readLine().split(" ");
        int num[] = new int[n];
        for (int i = 0; i < n; i++)
            num[i] = Integer.parseInt(line2[i]);
        //维护一个容量为3的小顶堆,存储最大的三个数,
            PriorityQueue<Integer> min = new PriorityQueue<>(3);
        //维护一个容量为2的大顶堆,存贮最小的两个数
        PriorityQueue<Integer> max = new PriorityQueue<>(2,(o1, o2) -> o2 - o1);
        for (int i = 0; i < n; i++){
            if (min.size() < 3) min.offer(num[i]);
            else {
                if (num[i] > min.peek()){
                    min.poll();
                    min.offer(num[i]);
                }
            }
            if (max.size() < 2) max.offer(num[i]);
            else {
                if (num[i] < max.peek()){
                    max.poll();
                    max.offer(num[i]);
                }
            }
        }
        int max1 = min.poll(), max2 = min.poll(), max3 = min.poll();
        int min1 = max.poll(), min2 = max.poll();
        System.out.println(Math.max(1l*max1*max2*max3, 1l*max3*min1*min2));
    }
}


发表于 2020-05-13 12:25:21 回复(0)
求大佬解答一下这错在哪????
Scanner s = new Scanner(System.in);
		int line = s.nextInt();
		int[] shuzu = new int[line];
		for(int i=0;i<shuzu.length;i++) {
			shuzu[i]=s.nextInt();
		}
		Arrays.sort(shuzu);
		
		long a = shuzu[shuzu.length-3]*shuzu[shuzu.length-1]*shuzu[shuzu.length-2];
		long b = shuzu[shuzu.length-1]*shuzu[0]*shuzu[1];
		
			if(a>=b) {
				System.out.println(a);
			}
			else {
				System.out.println(b);
			}



一直显示这样
对应输出应该为:

807120253114

你的输出为:

-333598534
发表于 2020-04-01 00:24:16 回复(1)
简单易懂
如果不考虑负数最大的值肯定是最大的三个值相乘 得到result1,考虑到负数,
用最小的两个数,与最大的数的乘积 result2,
result1和result2 中大的那个肯定是要的最大值
ort java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		long[] arr = new long[n];
		for(int i =0; i < n; i++) {
			arr[i] = scan.nextLong();
		}
		
		Arrays.sort(arr);
		int  len = arr.length;
		long result1 = arr[len-1]*arr[len-2]*arr[len-3];
		long result2 = arr[0]*arr[1]*arr[len-1];
		
		System.out.println(Math.max(result1, result2));
	}
}


发表于 2019-09-11 17:38:09 回复(0)
//利用包装类Collections提供的sort方法。  import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); if (n < 3) { return;
        }
        ArrayList<Long> list = new ArrayList<>(); for (int i = 0; i < n; i++) {
            list.add(scanner.nextLong());
        }
        Collections.sort(list); long max = list.get(list.size() - 1) * list.get(list.size() - 3) * list.get(list.size() - 2); long min = list.get(0) * list.get(1) * list.get(list.size() - 1);
        max = max > min ? max : min;

        System.out.println(max);

    }
}


发表于 2019-09-07 16:03:52 回复(0)
一个小顶堆qmax,一个大顶堆qmin
遍历一遍arr:如果当前数比qmax堆顶大,则qmax删堆顶,加入当前数,最后得到arr中最大的3个数
如果当前数比qmin堆顶小,qmin删堆顶,加入当前数,最后得到arr中最小的三个数

遍历结束后依次弹出qmax的三个数c <= b <= a
依次弹出qmin的3个数:第三小的数(忽略) >= e >= f

最后结果为 a*b*c 以及 a*e*f 中的较大者。

因为两个堆最多都只放3个数,空间复杂度为常数级别

import java.util.Scanner;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Main {
    public static long getMax(long[] arr){
        if (arr.length == 3)
            return arr[0]*arr[1]*arr[2];
        PriorityQueue<Long> qmax = new PriorityQueue<>();
        PriorityQueue<Long> qmin = new PriorityQueue<>((Long o1, Long o2) -> {
            return o2>o1? 1 : -1;
        });
        for (int i = 0; i < 3; i++) {
            qmax.add(arr[i]);
            qmin.add(arr[i]);
        }
        for (int i = 3; i < arr.length; i++) {
            if (qmax.peek()<arr[i]){
                qmax.poll();
                qmax.add(arr[i]);
            }
            if (qmin.peek()>arr[i]){
                qmin.poll();
                qmin.add(arr[i]);
            }
        }
        long c = qmax.poll(), b = qmax.poll(), a = qmax.poll();
        qmin.poll();
        long e = qmin.poll(), f = qmin.poll();
        return a*e*f>a*b*c?a*e*f:a*b*c;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            long[] arr = new long[n];
            for (int i = 0; i < n; i++) {
                arr[i] = scanner.nextLong();
            }
            System.out.println(getMax(arr));
        }
    }
}


发表于 2019-08-23 01:11:32 回复(0)
import java.util.Scanner;

public class Main {

    public static long process(long[] arr) {
        long neg1 = 0;
        long neg2 = 0;
        long pos1 = 0;
        long pos2 = 0;
        long pos3 = 0;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < 0) {
                if (arr[i] < neg1) {
                    neg2 = neg1;
                    neg1 = arr[i];
                } else if (arr[i] < neg2) {
                    neg2 = arr[i];
                }
            } else {
                if (arr[i] > pos3) {
                    pos1 = pos2;
                    pos2 = pos3;
                    pos3 = arr[i];
                } else if (arr[i] > pos2) {
                    pos1 = pos2;
                    pos2 = arr[i];
                } else if (arr[i] > pos1) {
                    pos1 = arr[i];
                }
            }
        }

        long res1 = neg1 * neg2 * pos3;
        long res2 = pos1 * pos2 * pos3;
        return res1 > res2 ? res1 : res2;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] arr = new long[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextLong();
        }
        System.out.println(process(arr));
    }
}
发表于 2019-06-17 16:00:38 回复(0)

先自己设置数组的长度a,再通过循环a次,把每个值添加到数组中。通过Arrays.sort(数组名称); 对数组进行排序,然后再统计 数组中 值为负数的数量 是否大于等于 2 ,因为负负得正 , 再比较 (最大的三个数的乘积) 与 (最小的两个负数和最大的整数的乘积)输出较大的值。如果 数组中 值为负数的数量 小于2,则直接输出 最大的三个正整数的乘积。

import java.util.*;
 public class Main {
 public static void main(String[] args) {
 Scanner in = new Scanner(System.in);
 int a = in.nextInt();
 int i = 0 ;
 long[] array = new long[a];
 for (; i < a ; i++) {
 array[i] = in.nextInt();
    int k = 0 ;
    for (int j = 0; j < i ; j++) {
        if (array[j] < 0){
            k++;
        }
    }
    Arrays.sort(array);
    //System.out.println(Arrays.toString(array));
    if (k >= 2){
        //System.out.println(array[0] + "," + array[1] + "," + array[i-1]);
        long x = array[0] * array[1]  * array[i-1];
        //System.out.println(x);
        long y = array[i-1] * array[i-2] * array[i-3];
        //System.out.println(y);
        if (x>y) {
            System.out.println(x);
        }else{
            System.out.println(y);
        }
    }else {
        long c = array[i-1] * array[i-2] * array[i-3];
        System.out.println(c);
    }
}
}
}
编辑于 2019-05-13 15:51:49 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String args[]) throws IOException {
        /*
        Scanner 输入耗时
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();*/
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int len = Integer.valueOf(reader.readLine());
        String[] arr = reader.readLine().split(" ");
        long arr2[] = new long[len];
        for(int i = 0; i < len; i++) 
            arr2[i] = Integer.valueOf(arr[i]);
        System.out.println(maxMul(arr2));
    }
    private static long maxMul(long[] arr) {
        long result = 0;
        long max1 = 0, max2 = 0, max3 = 0,min1 = 0, min2 = 0;
        if(arr.length == 3)
            result = arr[0] * arr[1] * arr[2];
        else {
            for(int i = 0; i < arr.length; i++) {
                if(arr[i] != 0) {
                    if(arr[i] > max1) {
                        max3 = max2;
                        max2 = max1;
                        max1 = arr[i];
                    }else if(arr[i] > max2) {
                        max3 = max2;
                        max2 = arr[i];
                    }else if(arr[i] > max3) {
                        max3 = arr[i];
                    }
                    if(arr[i] < min1) {
                        min2 = min1;
                        min1 = arr[i];
                    }else if(arr[i] < min2)
                        min2 = arr[i];
                }else {
                    continue;
                }
            }
            result = Math.max(max1 * max2 * max3, max1 * min1 * min2);
        }
        return result;
    }        
}
发表于 2019-04-27 12:26:08 回复(0)
import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long[] array=new long[n];
        for(int i=0;i<n;i++){
            array[i]=sc.nextLong();
        }

        getTheMostValue(array,n);
    }
    
    public static void getTheMostValue(long[] num,int len){
        long max1=0;long max2=0;long max3=0;long min1=0;long min2=0;
        
        for(int i=0;i<len;i++){
            if(num[i]>max1){
                max3=max2;
                max2=max1;
                max1=num[i];
            }else if(num[i]>max2){
                max3=max2;
                max2=num[i];
            }else if(num[i]>max3){
                max3=num[i];
            }else if(num[i]<min1){
                min2=min1;
                min1=num[i];
            }else if(num[i]>min1&&num[i]<min2){
                min2=num[i];
            }
        }
        
        long max=Math.max(max1*max2*max3,max1*min1*min2);
        System.out.println(max);
    }
}

发表于 2019-04-21 21:58:24 回复(0)
public static void main(String[] args)throws Exception {
String str;
while((str=br.readLine())!=null) {
String [] str1=str.trim().split(" ");
if(str1.length>=3){
int num=0;
long []list=new long[str1.length];
for(int i=0;i<str1.length;i++) {
long l=Long.parseLong(str1[i]);
list[i]=l;
if(l<0) num++;
}
Arrays.sort(list);
if(num<=1) {
long number=(long)list[list.length-1]*(long)list[list.length-2]*(long)list[list.length-3];
System.out.println(number);
break;
}else {
long number1=(long)list[list.length-1]*(long)list[1]*(long)list[0];
long number2=(long)list[list.length-1]*(long)list[list.length-2]*(long)list[list.length-3];
if(number1>number2) {System.out.println(number1);break;}
else  {System.out.println(number2);break;}
}
}else continue;

}
}
}

编辑于 2019-04-11 09:27:05 回复(0)

最大乘积

思路:

1.先排序

2.分两种情况:第一种数组中有正数也有负数,并且有两个以上负数,则排好序后前两个数和最后一个数相加;

第二种,数组后三个数相加,对比第一第二种情况那个值大就输出哪个。

3.使用长整形long定义数组防止溢出。

    importjava.util.*;
    publicclassMain{
    publicstaticvoidsort1(longb[]){
    for(inti=0;i<b.length-1;i++){
    for(intj=0;j<b.length-i-1;j++){
    if(b[j]>b[j+1]){
    longtemp;
    temp=b[j+1];
    b[j+1]=b[j];
    b[j]=temp;
        }
    }
  }
}
    publicstaticvoidmain(String[] args) {
    Scanner input = newScanner(System.in);
    intlen = input.nextInt();
    inti;
    long[] a = newlong[len];
    for( i=0;i<a.length;i++) {
    a[i]=input.nextInt();
    }
    sort1(a);
    longsum=0;
    longsum1=0;
    sum = a[a.length-1]*a[a.length-2]*a[a.length-3];
    sum1 = a[0]*a[1]*a[a.length-1];
    if(sum<sum1) {
    sum=sum1;
       }
    System.out.println(sum);
   }
}
编辑于 2019-04-07 11:15:10 回复(1)
public class Main {
   
    public static long main1(long[] a) {
        long max1=0;
        long max2=0;
        long max3=0;

        long small=0;
        long small2=0;
        for (Long aLong : a) {
            if (aLong > max1) {
                max3 = max2;
                max2 = max1;
                max1 = aLong;
            } else if (aLong > max2) {
                max3 = max2;
                max2 = aLong;
            } else if (aLong > max3) {
                max3 = aLong;
            }

            if (aLong < small) {
                small2=small;
                System.out.println(small);
                small = aLong;
            } else if (aLong < small2) {
                small2 = aLong;

            }

        }
        long max = Math.max(max1 * max2 * max3, max1 * small * small2);

        return max;

    }
}
求各位大佬指点,在idea上运行好像没有发现什么问题。提交以后就说
您的代码已保存
请检查是否存在数组越界等非法访问情况
case通过率为0.00%
发表于 2019-04-06 17:24:28 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        long[]a = new long[m];
        for(int i=0;i<m;i++){
            a[i]=sc.nextLong();
        }
  java.util.Arrays.sort(a);     //数组从小到大排序
  int n = a.length;
  long first = a[0] * a[1] * a[n-1];
  long second = a[n - 3] * a[n - 2] * a[n - 1];
  if (first > second)
   System.out.println(first);
  else
   System.out.println(second);
 }
}

发表于 2019-04-02 23:32:10 回复(0)
为什么同样的代码,在leetcode上可以通过,在牛客就只能通过22.22%

发表于 2019-04-02 09:28:54 回复(1)
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int sum = in.nextInt();
        List<Integer> set = new ArrayList<>();
        for(int i=0;i<sum;i++) {
            set.add(in.nextInt());
        }
        set.sort((a,b)->{
            return a>b?1:-1;
        });
        
        BigDecimal b1=new BigDecimal(set.get(0));
        BigDecimal b2=new BigDecimal(set.get(1));
        BigDecimal b3=new BigDecimal(set.get(set.size()-1));
        BigDecimal b4=new BigDecimal(set.get(set.size()-2));
        BigDecimal b5=new BigDecimal(set.get(set.size()-3));
        BigDecimal m1=b1.multiply(b2).multiply(b3);
        BigDecimal m2=b3.multiply(b4).multiply(b5);
        if(m1.compareTo(m2)>0) {
            System.out.println(m1);
        }else {
            System.out.println(m2);
        }
    }
}
BigDecimal 计算大数据,这里用的行数比较多
发表于 2019-03-31 11:05:27 回复(0)
public class MaxProduct {

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        int nextInt = scanner.nextInt();
        long[] arr = new long[nextInt];        
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextLong();
        }
        scanner.close();
        long maxProduct = getMaxProduct(arr);
        System.out.println(maxProduct);        
        
    }

    private static long getMaxProduct(long[] arr) {
        
        long max1=0,max2=0,max3=0,min1=0,min2=0;
        for (long l : arr) {
            if(max1<l){
                max3=max2;
                max2=max1;
                max1=l;
            }else if(max2<l){
                max3=max2;
                max2=l;
            }else if(max3<l){
                max3=l;
            }else if(l<min1){
                min2=min1;
                min1=l;
            }else if(min1<l&&l<min2){
                min2=l;
            }
        }
        return Math.max(max1*max2*max3, max1*min1*min2);
    }
    
}
发表于 2019-03-20 15:54:17 回复(0)
题目的意思是第一个数字不是代表有几个数字吧,第一个数字也是数组中的value
为啥大家都把第一个数字当做个数是因为那样省时间吗?

发表于 2019-03-20 15:24:24 回复(0)
import java.util.*;
class Solution {
    public long maximumProduct(int[] nums) {
        Arrays.sort(nums);
        if(nums[1] < 0) {
            long t = nums[0] * nums[1];
            long tt = nums[nums.length - 2] * nums[nums.length - 3];
            
            return ((t > tt ? t : tt) * nums[nums.length - 1]);
        } else {
            return nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3];
        }
    }
}
public class Main {
   public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a = in.nextInt();
    int nums[] = new int[a];
    for (int i = 0; i < a; i++) {
        nums[i] = in.nextInt();
    }
    //System.out.println(Integer.MAX_VALUE);
    Solution s1 = new Solution();
    System.out.println(s1.maximumProduct(nums));
}
}
//就一点,注意int不够使,用long
发表于 2019-03-12 15:24:42 回复(0)