贴原题:
解析:
本题是给出一个数组,让从中选择3个数,使得这三个数的乘积最大,并返回这个成绩结果。
我的思路依旧是先排序,毕竟乱序很难从中得到实际想要的数,排序算法我采用了堆排序。排好序之后由于可能出现最小的几个数是负数的情况,所以优先考虑最小的两个数和最大数的乘积是否大于三个最大数的乘积,若成立则返回该数。否则,返回三个最大数的乘积。
exp1:-10,-9,-1,0,1,2,3
最大值应该是-10*-9*3
exp2:-3,-2,-1,0,1,2,3
最大值应该是-3*-2*3
exp3:-3,-2,-1,0,1,5,6,9
最大值应该是9*6*5
堆排序带注释版题目链接:http://blog.csdn.net/m0_37454852/article/details/78156566
贴代码:
void heapAdjust(int* nums, int numsSize, int root)
{
int left=2*root;
int right=left++;
int largest=root;
if(left<numsSize && *(nums+left)>*(nums+largest))
{
largest=left;
}
if(right<numsSize && *(nums+right)>*(nums+largest))
{
largest=right;
}
if(largest!=root)
{
*(nums+largest)=*(nums+largest)^*(nums+root);
*(nums+root)=*(nums+largest)^*(nums+root);
*(nums+largest)=*(nums+largest)^*(nums+root);
heapAdjust(nums, numsSize, largest);
}
}
void heapSort(int* nums, int numsSize)
{
for(int i=numsSize/2; i>=0; i--)
{
heapAdjust(nums, numsSize, i);
}
for(int i=numsSize-1; i>0; i--)
{
*nums=*nums^*(nums+i);
*(nums+i)=*nums^*(nums+i);
*nums=*nums^*(nums+i);
heapAdjust(nums, i, 0);
}
}
#define myabs(x) (x>0?x:(-x))
#define max(a, b) (a>b?a:b)
int maximumProduct(int* nums, int numsSize) {
heapSort(nums, numsSize);//堆排序,升序
if(nums[0]*nums[1]*nums[numsSize-1]>nums[numsSize-3]*nums[numsSize-1]*nums[numsSize-2])
{//考虑最小的两个数为负数的情况
return nums[0]*nums[1]*nums[numsSize-1];
}
return nums[numsSize-3]*nums[numsSize-1]*nums[numsSize-2];
}