当前位置: 首页 > news >正文

[JAVA数组] 三个数的最大乘积

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入:nums = [1,2,3]
输出:6

示例 2:

输入:nums = [1,2,3,4]
输出:24

示例 3:

输入:nums = [-1,-2,-3]
输出:-6

提示:

  • 3 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

方法一:排序
首先将数组排序。

如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。

如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。

综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。

class Solution {public int maximumProduct(int[] nums) {Arrays.sort(nums);int n = nums.length;return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);}
}

方法二:线性扫描

在方法一中,我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。

class Solution {public int maximumProduct(int[] nums) {// 最小的和第二小的int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;// 最大的、第二大的和第三大的int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;for (int x : nums) {if (x < min1) {min2 = min1;min1 = x;} else if (x < min2) {min2 = x;}if (x > max1) {max3 = max2;max2 = max1;max1 = x;} else if (x > max2) {max3 = max2;max2 = x;} else if (x > max3) {max3 = x;}}return Math.max(min1 * min2 * max1, max1 * max2 * max3);}
}

相关文章:

  • 2024-5-14——完成所有任务需要的最少轮数
  • 不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?
  • PostgreSQL启动报错“could not map anonymous shared memory: Cannot allocate memory”
  • Python学习从0开始——Kaggle机器学习003总结
  • [线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议
  • 3DGS语义分割之LangSplat
  • 步进电机双闭环细分控制(matlab仿真)内含课设等参考文件
  • 新闻出版署发布新规定,腾讯游戏限制未成年人端午期间每天一小时
  • 搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试
  • LAMP分布式安全方案搭建网页 (LinuxCentOS7+Apache+Mariadb+PHP)包括服务端口及防火墙规则配置
  • 防雷接地测试方法及注意事项
  • 前端 JS 经典:判断数组的准确方法
  • LLM主流开源代表模型
  • ethernet eth0: Could not attach to PHY
  • 家宽动态公网IP,使用docker+ddns 实现动态域名解析
  • 深入了解以太坊
  • $translatePartialLoader加载失败及解决方式
  • 【刷算法】从上往下打印二叉树
  • CentOS 7 修改主机名
  • Java读取Properties文件的六种方法
  • mysql innodb 索引使用指南
  • PHP面试之三:MySQL数据库
  • spring学习第二天
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 和 || 运算
  • 前端自动化解决方案
  • 如何进阶一名有竞争力的程序员?
  • 时间复杂度与空间复杂度分析
  • 算法-插入排序
  • 线性表及其算法(java实现)
  • 新书推荐|Windows黑客编程技术详解
  • 原生 js 实现移动端 Touch 滑动反弹
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​linux启动进程的方式
  • ​如何使用QGIS制作三维建筑
  • (03)光刻——半导体电路的绘制
  • (11)MATLAB PCA+SVM 人脸识别
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (阿里云万网)-域名注册购买实名流程
  • (八)Spring源码解析:Spring MVC
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (原)Matlab的svmtrain和svmclassify
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(一):@echo off
  • .NET BackgroundWorker
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET MVC第五章、模型绑定获取表单数据