最大乘积

博客围绕牛客网的一道题展开,题目要求在无序数组中找出3个数的乘积使其最大,需满足时间复杂度O(n)和空间复杂度O(1)。作者分享了解题过程中遇到的问题,如输入用例有误、未考虑数组大小小于3的情况等,还提及了排序方法及堆的使用思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://www.nowcoder.com/questionTerminal/5f29c72b1ae14d92b9c3fa03a037ac5f
来源:牛客网

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

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积

示例1

输入

3 4 1 2

输出

24

解题:这个题牛客的用例应该是写错了,输入里面少一个数组大小,导致我怎么写都错,后来变成先输入数组大小的就好了。

还有就是这个题要求时间复杂度为0(n),但是平台应该也不限制用什么。这个题其实就是要求5个数组,最大,第二大,第三大,最小,第二小。

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

public class Main {
	public static void main(String[] args)
{
		Scanner sc=new Scanner(System.in); 
		//String[] nums = sc.nextLine().split(" "); 
		int n=sc.nextInt();
		Long  num[]=new Long[n];
		for(int i=0;i<n;i++)
		    num[i]=sc.nextLong();
		Arrays.sort(num);
		System.out.println(Math.max(num[0]*num[1]*num[n-1], num[n-1]*num[n-2]*num[n-3]));
}
}

代码不足,但是平台没检测出来,或者说用例没提示我该怎么做的是:数组大小小于3怎么办?

本人代码没考虑的问题,时间复杂度O(n),这里我懒省事直接用的数组的排序函数,如果手动撸代码的时候直接弄个小顶堆,弄出来最大的3个,大顶堆弄出来最小的前两个。时间复杂度就是O(n)比那个跑5次冒泡要快很多,或者说更巧妙一些。

堆怎么用呢,有什么用途呢。下一篇再写吧!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值