leetcode 628. Maximum Product of Three Numbers(C语言,堆排序,计算最大乘积)33

贴原题:
这里写图片描述

解析:
  本题是给出一个数组,让从中选择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];
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值