最大乘积

题目描述

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入

3 4 1 2

输出

24

解题的思路

切记不能排序:因为时间复杂度:O(n),空间复杂度:O(1)

  1. 数组全部是正数,最大三个数的乘积

  2. 数组全部是负数,最大三个数的乘积

  3. 数组有正有负,最大的一个数和最小的两个数的乘积

所以一共需要计算五个值:数组中最大的三个值和最小的两个值

比较最大三个数的乘积和最大一个数与最小两个数的乘积。

因为题目要求时间复杂度为O(1),故不能先排序。

所以需要在遍历的同时找出这五个数。

我们看看代码


import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        //输入技巧:先用String类型获取键盘输入字符的长度,并将输入的String 类型转换为int类型,存入int型数组里面
        Scanner input = new Scanner(System.in);
        int n = Integer.parseInt(input.nextLine());
        String[] str = input.nextLine().split(" ");
        int[] arr = new int[str.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(str[i]);
        }
        getMax(arr);
    }
    public static void getMax(int[] arr) {
    		//定义五个数:
        int max = 1, second_max = 1, third_max = 1;//最大的十个数
        int min = 1, second_min = 1;//最小的两个数(有正数有负数的情况下)
        for (int i = 0; i < arr.length; i++) {
            if (max < arr[i]) {
                third_max = second_max;
                second_max = max;
                max = arr[i];
            } else if (second_max < arr[i]) {
                third_max = second_max;
                second_max = arr[i];
            } else if (third_max < arr[i]) {
                third_max = arr[i];
            } else if (arr[i] < min) {
                second_min = min;
                min = arr[i];
            } else if (arr[i] < second_min) {
                second_min = arr[i];
            }
        }
        long max1 = (long) max * second_max * third_max;//三个最大的情况
        long max2 = (long) max * second_min * min;//一个大的两个小
        if (max1 >= max2) {
  
             System.out.println("max:"+max+" second_max:"+second_max+" third_max:"+third_max+" result:"+max1);
        } else {
        
             System.out.println("max:"+max+" second_min:"+second_min+" min:"+min+" result:"+max2);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值