生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。人

随笔 - 151  文章 - 0  评论 - 117  阅读 - 108万 

 


最大乘积
 
时间限制:1秒 空间限制:32768K 热度指数:8197
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

题目描述

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

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积
示例1

输入


3 
4 1 2

输出

8


思路分析:

看到这个题目,下意识想到用Arrays.sort()排一下序,

因为输入的整数可以是负数,所以只需要用Math.max()判断一下,

最大的三个数的乘积 与 最小两个数与最大那个数的乘积 哪个数大,输出哪个就行啦,

例如:5,3,2,-8,-9;
5*3*2=30 < 5*(-8)*(-9)=360

but Arrays.sort()的思路是归并排序,时间复杂度是O(n*log(n)),不符合题目要求
所以,额,,,我就用了最最笨的方法哈哈:

我用三个变量存前三大的整数,用两个变量存最小的两个数;

一边接收输入的值,一边判断,时间复杂度为O(n),空间复杂度为O(1);

最后输出 最大的那三个数的乘积大与最小的那两个数与最大的数的乘积中较大的数就ok啦。

Java 代码如下:
复制代码
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sca = new Scanner(System.in);
        int n = 0;
        int m = sca.nextInt();
        int max=Integer.MIN_VALUE,max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,min=Integer.MAX_VALUE,min1 = Integer.MAX_VALUE;
        for(int i = 0;i<m;i++){
            n = sca.nextInt();
           if(max>n){
                   max2 = Math.max(Math.min(max1,n),max2);
                max1 = Math.max(max1,n);
           }else{
                max2 = max1;
                max1 = max;
                max = n;
            }
            if(min<n)
                min1 = Math.min(min1,n);
            else{
                min1 = min;
                min = n;
            }
        }
        long a = (long)max*max1*max2;
        long b = (long)max*min*min1;
        System.out.println(Math.max(a,b));
    }
}
复制代码

 

 
posted on   测试开发喵  阅读(543)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示