当前位置:首页 > 力扣 > 力扣628题“三个数的最大乘积”的题解

力扣628题“三个数的最大乘积”的题解

6个月前 (08-21)

力扣628题“三个数的最大乘积”的题解 力扣 力扣题解 C++ 第1张

一、题目解读

力扣628题要求在一个整数数组中,找到三个数的乘积最大值。题目强调数组元素可能有正有负,需考虑不同符号组合对乘积的影响。例如,数组[-2,0,1,2,3]中,最大乘积为(-2) * 1 * 3 = -6(错误),正确解应为2 * 3 * (-2) = -12。因此,需同时关注正数乘积与负数优化。

二、解题思路

采用“排序+对比”策略:

1. 核心逻辑:排序后,乘积最大值可能来自三个最大正数(如[3,2,1]中321)或两个最小负数*一个最大正数(如[-2,-1,3]中-2 * -1 * 3)。

2. 负数处理:若数组含负数,两负相乘转正数,再与最大正数组合可能更优。

3. 边界判断:需确保数组长度≥3,避免空值或不足情况。

三、解题步骤

1. 排序数组:使用sort()函数对nums升序排列,时间复杂度O(nlogn)。

2. 计算两种乘积:

○ case1:末尾三个数乘积(nums[n-1] * nums[n-2] * nums[n-3])。

○ case2:首两负数(若存在)与最大正数乘积(nums[0] * nums[1] * nums[n-1])。

3. 返回较大值:max(case1, case2)。

四、代码与注释

#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        // 先对数组进行排序
        sort(nums.begin(), nums.end());
        int n = nums.size();
        
        // 计算两种可能的情况
        int case1 = nums[n-1] * nums[n-2] * nums[n-3]; // 三个最大正数
        int case2 = nums[0] * nums[1] * nums[n-1];     // 两个最小负数和一个最大正数
        
        // 返回两种情况中的较大值
        return max(case1, case2);
    }
};

注释说明:代码通过排序简化逻辑,直接利用索引定位关键元素,避免复杂遍历,确保O(nlogn)高效性。

五、总结

本解法关键在于:

1. 排序降低复杂度:避免暴力枚举,通过有序数组快速定位极端值。

2. 正负组合优化:负数相乘转正,与正数结合可能突破纯正数乘积上限。

3. 边界与极端情况:需验证数组长度≥3,避免空值错误。

掌握此思路,可高效应对同类乘积优化问题,提升算法设计能力。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。