给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意:
- 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
好久没在力扣上面刷过题了,今天刚好看到了这道题(上面标注的是简单题),想了五分钟,开始觉得先排序,然后取排好序的数组的最后三个元素相乘jiun就能得到结果。
代码如下:
class Solution {
//先对该输入数组进行排,然后取排序后的新数组的最后三个元素进行相乘,即可得到最终结果
public int maximumProduct(int[] nums) {
int result = 0;
for(int i = 0; i < nums.length - 1; i ++) {
for(int j = 0; j < nums.length - i - 1; j ++) {
if(nums[j] > nums[j +1 ]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
result = nums[nums.length -1] * nums[nums.length - 2] * nums[nums.length -3];
return result;
}
}
谁知道没有通过全部的测试用例:[-4,-3,-2,-1,60],这个测试用例的结果应该为720,w而我的结果却是120.
原理是没有考虑有负数的情况,于是修改了代码,让最小的两个负数和最大的正数相乘,并和刚才的结果比较,哪个结果大,就返回哪个值。代码如下:
class Solution {
//先对该输入数组进行排,然后取排序后的新数组的最后三个元素进行相乘,即可得到最终结果
public int maximumProduct(int[] nums) {
int result1 = 0;
int result2 = 0;
for(int i = 0; i < nums.length - 1; i ++) {
for(int j = 0; j < nums.length - i - 1; j ++) {
if(nums[j] > nums[j +1 ]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
result1 = nums[nums.length -1] * nums[nums.length - 2] * nums[nums.length -3];
result2 = nums[nums.length -1] * nums[0] * nums[1];
return result1 > result2 ? result1:result2;
}
}
这次的测试用例巨长,直接显示超时,运行不通过。于是不得不再次修改代码。决定用Java自带的排序算法试试。于是就有了下面的代码:
class Solution {
//先对该输入数组进行排,然后取排序后的新数组的最后三个元素进行相乘,即可得到最终结果
public int maximumProduct(int[] nums) {
int result1 = 0;
int result2 = 0;
Arrays.sort(nums);
result1 = nums[nums.length -1] * nums[nums.length - 2] * nums[nums.length -3];
result2 = nums[nums.length -1] * nums[0] * nums[1];
return result1 > result2 ? result1:result2;
}
}
最后终于成功了。。。