【C++刷题】力扣-#628-三个数的最大乘积

题目描述

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例

示例 1

输入:nums = [1,2,3]
输出:6

示例 2

输入:nums = [1,2,3,4]
输出:24

示例 3

输入:nums = [-1,-2,-3]
输出:-6

题解

这个问题可以通过排序和考虑正数与负数的组合来解决。

  1. 排序:首先对数组进行排序。
  2. 考虑情况:
    ○ 如果数组中包含负数,最大的乘积可能来自两个最小的负数(它们的乘积为正数)和一个最大的正数。
    ○ 如果数组中不包含负数,最大的乘积就是最大的三个数的乘积。
  3. 计算最大乘积:根据排序后的数组,计算上述两种情况的乘积,并返回较大的那个。

代码实现

int maximumProduct(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    int n = nums.size();
    // 情况1: 两个最小的负数和一个最大的正数
    int product1 = nums[0] * nums[1] * nums[n - 1];
    // 情况2: 三个最大的正数
    int product2 = nums[n - 1] * nums[n - 2] * nums[n - 3];

    return max(product1, product2);
}

复杂度分析

● 时间复杂度:O(n log n),其中 n 是数组 nums 的长度。主要时间消耗在排序上。
● 空间复杂度:O(1),除了输入数组外,我们只使用了常数个额外变量。
这个算法通过排序和考虑两种可能的情况来计算最大乘积。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值