博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】数组-2(628)-数组中三个数相乘最大
阅读量:5238 次
发布时间:2019-06-14

本文共 2407 字,大约阅读时间需要 8 分钟。

题目不难:

思路一(排序取两端)

先排序,最后三个数相乘即可。(很快就想到了,但是没想全面 [?] )

缺陷:没有考虑到有负数的情况,当至少有两个负数时,需要判断 最大数乘两个最小的负数 和 三个最大数相乘的大小,返回大的。

代码如下:

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

复杂度分析 主要是排序比较浪费

时间复杂度:O(n*logn)

空间复杂度:O(n*logn)

 

思路二(不排序,只遍历一次,只保存三个最大的,和两个最小的)

此题get新技能 最大数和最小数的表示法。Integer.MAX_VALUE Integer.MIN_VALUE

注意更新时不能只判断一个,其他的也要判断,要不就丢解了。下面程序说明。

(错误代码示范)

1 public class Solution { 2     public int maximumProduct(int[] nums) { 3         if (nums == null || nums.length < 1) { 4             return -1; 5         } 6         int min1 = Integer.MAX_VALUE; 7         int min2 = Integer.MAX_VALUE; 8         int max1 = Integer.MIN_VALUE; 9         int max2 = Integer.MIN_VALUE;10         int max3 = Integer.MIN_VALUE;11         12         for (int i : nums) {13             if (i < min1) {14                 min2 = min1;15                 min1 = i;16             } 17             if (i > max1) {18                 max3 = max2;19                 max2 = max1;20                 max1 = i;21             }22         }23         return Math.max(max1 * max2 * max3, min1 * min2 * max3);24     }25 }

(正确的代码)还要注意不等号中的等号不能省略,因为可能有相等的情况。

1 public class Solution { 2     public int maximumProduct(int[] nums) { 3         if (nums == null || nums.length < 1) { 4             return -1; 5         } 6         int min1 = Integer.MAX_VALUE; 7         int min2 = Integer.MAX_VALUE; 8         int max1 = Integer.MIN_VALUE; 9         int max2 = Integer.MIN_VALUE;10         int max3 = Integer.MIN_VALUE;11         12         for (int i : nums) {13             if (i <= min1) {14                 min2 = min1;15                 min1 = i;16             } else if (i >= min1 && i <= min2) {17                 min2 = i; //别忘了更新 min2 哦,下面同理~18             }19             if (i >= max1) {20                 max3 = max2;21                 max2 = max1;22                 max1 = i;23             } else if (i <= max1 && i >= max2) {24                 max3 = max2;25                 max2 = i;26             } else if (i <= max2 && i >= max3) {27                 max3 = i;28             }29         }30         return Math.max(max1 * max2 * max3, min1 * min2 * max1);31     }32 }

复杂度分析 

时间复杂度:O(n)

空间复杂度:O(1)

 

转载于:https://www.cnblogs.com/StoneLuo/p/7376595.html

你可能感兴趣的文章
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
初识lua
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
算法之搜索篇
查看>>