问题原文点击打开链接
先对这道题进行排序,然后排序前三的整数相乘。但是要考虑两种特殊情况,第一是数组里面包含负整数的情况,第二种是前三里面包含0的情况。分开讨论问题就很简单了。
public void intiHeap(int[] nums,int length,int parent){
int val = nums[parent];
int child = 2*parent+1;
while( child < length){
if (child+1 < length && nums[child+1]<nums[child]) child++;
if (val<nums[child]) break;
nums[parent] = nums[child];
parent = child;
child = 2*parent+1;
}
nums[parent] = val;
}
public void sort(int[] nums){
for (int i = nums.length/2;i >= 0;i--){
intiHeap(nums,nums.length,i);
}
for (int i = nums.length-1;i>=0;i--){
int tmp = nums[0];
nums[0] = nums[i];
nums[i] = tmp;
intiHeap(nums,i,0);
}
}
public int maximumProduct(int[] nums) {
sort(nums);
int startPos = -1;
int endPos = -1;
//记录第一个0出现的位置
for (int i = 0;i<nums.length;i++){
if (nums[i] == 0) {
startPos = i;
break;
}
}
//记录最后一个0出现的位置
for (int i = nums.length-1;i>=0;i--){
endPos = i;
break;
}
if (startPos <= 2 && startPos >0){
if (endPos+2<nums.length){
return nums[0]*nums[nums.length-1]*nums[nums.length-2];
}else{
return 0 ;
}
}
//记录下第一个负数出现的位置
int negExit = -1;
for (int i = 0;i<nums.length;i++){
if (nums[i]<0){
negExit = i;
break;
}
}
if (negExit>-1 && negExit+1<nums.length){
return nums[0]*nums[1]*nums[2]>nums[0]*nums[nums.length-1]*nums[nums.length-2]?
nums[0]*nums[1]*nums[2]:nums[0]*nums[nums.length-1]*nums[nums.length-2];
}
return nums[0]*nums[1]*nums[2];
}