版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hsx1612727380/article/details/84578746
Title:Maximum Product of Three Numbers 605
Difficulty:Easy
原题leetcode地址:https://leetcode.com/problems/can-place-flowers/
1. 注意两个负数的乘积为正数
时间复杂度:O(n),一次一层for循环,最长遍历整个数组的长度。
空间复杂度:O(1),没有申请空间。
/**
* 1. 3个正数相乘,或者2个负数和一个正数相乘,最后比较他们的结果
* @param nums
* @return
*/
public static int maximumProduct(int[] nums) {
if (nums == null || nums.length < 3) {
return 0;
}
int firstMaxPositive = Integer.MIN_VALUE;
int secondMaxPositive = Integer.MIN_VALUE;
int thirdMaxPositive = Integer.MIN_VALUE;
int firstMinNegative = Integer.MAX_VALUE;
int secondMinNegative = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > firstMaxPositive) {
thirdMaxPositive = secondMaxPositive;
secondMaxPositive = firstMaxPositive;
firstMaxPositive = nums[i];
}
else if (nums[i] > secondMaxPositive) {
thirdMaxPositive = secondMaxPositive;
secondMaxPositive = nums[i];
}
else if (nums[i] > thirdMaxPositive) {
thirdMaxPositive = nums[i];
}
if (nums[i] < firstMinNegative) {
secondMinNegative = firstMinNegative;
firstMinNegative = nums[i];
}
else if (nums[i] < secondMinNegative) {
secondMinNegative = nums[i];
}
}
return Math.max(firstMaxPositive * secondMaxPositive * thirdMaxPositive,
firstMaxPositive * firstMinNegative * secondMinNegative);
}
2. 先排序,在比较
时间复杂度:O(nlogn),给的是快排的时间复杂度,但是Java底层对排序的算法时取决于数组的长度。
空间复杂度:O(1),没有申请空间。
/**
* 先排序,后比较
* @param nums
* @return
*/
public static int maximumProduct1(int[] nums) {
if (nums == null || nums.length < 3) {
return 0;
}
Arrays.sort(nums);
return Math.max(nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3],
nums[nums.length - 1] * nums[0] * nums[1]);
}