拼多多笔试题之最大乘积

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积

示例1

输入

3 4 1 2

输出

24

思路:最大乘积=最大*次大*第三大 或者 最大*最小*次小(负负得正),因此有两种办法,1:排序后直接取,2:遍历数组直接找找出这5个数,判断哪种情况乘积最大

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

public class Pinduoduo01 {
    public static void main(String args[]){//方法1,先排序最后判断 最大*次大*第三大 和 最大*最小*次小
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String line = in.nextLine();
        int n = 61;
        String line = "3472 -7098 -9281 7789 7955 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";
        String[] arrs = line.split(" ");
        long[] arrays = new long[n];
        for (int i=0; i<n; i++){
            arrays[i] = Long.parseLong(arrs[i]);
        }

        Arrays.sort(arrays);

        long r1 = arrays[n-1]*arrays[n-2]*arrays[n-3];
        long r2 = arrays[0]*arrays[1]*arrays[n-1];
        if (r1 > r2){
            System.out.println(r1);
        } else {
            System.out.println(r2);
        }
    }

    public static void m2(){ //方法2 直接遍历数组 找到 最大 次大 第三大 次小 最小
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String line = in.nextLine();
//        int n = 61;
//        String line = "3472 -7098 -9281 7789 7955 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";
        String[] arrs = line.split(" ");
        long[] arrays = new long[n];
        for (int i=0; i<n; i++){
            arrays[i] = Long.parseLong(arrs[i]);
        }

        long max = Long.MIN_VALUE;
        long second = Long.MIN_VALUE;
        long third = Long.MIN_VALUE;
        long min = Long.MAX_VALUE;
        long secmin = Long.MAX_VALUE;

        for (int i=0; i<n; i++){
            if (arrays[i] > max){
                third = second;
                second = max;
                max = arrays[i];
            } else if (arrays[i] > second){
                third = second;
                second = arrays[i];
            } else if (arrays[i] > third){
                third = arrays[i];
            }

            if (arrays[i] < min){
                secmin = min;
                min = arrays[i];
            } else if (arrays[i] < secmin){
                secmin = arrays[i];
            }
        }

        long r1 = max*second*third;
        long r2 = max*secmin*min;
        if (r1 > r2){
            System.out.println(r1);
        } else {
            System.out.println(r2);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值