⭐算法入门⭐《线性枚举》中等02 —— LeetCode 628. 三个数的最大乘积
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《线性枚举》中等02 —— LeetCode 628. 三个数的最大乘积相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《画解数据结构》🌳
闭关刷 LeetCode,剑指大厂Offer! 🌌《LeetCode 刷题指引》🌌
LeetCode 太简单?算法学起来! 💜《夜深人静写算法》💜
一、题目
1、题目描述
给定一个整型数组
nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
样例输入:nums = [1,2,3]
样例输出:6
2、基础框架
- C语言 版本给出的基础框架代码如下:
int threeNegative(int* nums, int numsSize) {
}
3、原题链接
二、解题报告
1、思路分析
三个数的最大乘积,有这么几种情况:
1、三个负数:排序后,找最接近零的三个数相乘;
2、两个负数:最大的正数、最小的两个负数;
3、一个负数:最小的两个正数、最接近零的负数
4、零个负数:最大的三个正数相乘。
2、时间复杂度
- 排序后找出,找出正负数的分界点,然后按照上面四个规则分情况讨论,取最大值即可,所以时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)。
3、代码详解
int threeNegative(int* nums, int numsSize) {
int i;
for(i = 0; i < numsSize; ++i) {
if(nums[i] >= 0) {
break;
}
}
if(i - 3 < 0) {
return -1000000009;
}
return nums[i-1] * nums[i-2] * nums[i-3];
}
int twoNegative(int* nums, int numsSize) {
int i;
for(i = 0; i < numsSize; ++i) {
if(nums[i] >= 0) {
break;
}
}
if(nums[0] >= 0 || nums[1] >= 0) {
return -1000000009;
}
return nums[0] * nums[1] * nums[numsSize-1];
}
int oneNegative(int* nums, int numsSize) {
int i;
for(i = 0; i < numsSize; ++i) {
if(nums[i] >= 0) {
break;
}
}
if(i < 1 || i+1 >= numsSize ) {
return -1000000009;
}
return nums[i] * nums[i+1] * nums[i-1];
}
int zeroNegative(int* nums, int numsSize) {
int i;
for(i = 0; i < numsSize; ++i) {
if(nums[i] >= 0) {
break;
}
}
if(numsSize-3 < i ) {
return -1000000009;
}
return nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3];
}
int Max(int a, int b) {
return a > b ? a : b;
}
int comp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int maximumProduct(int* nums, int numsSize){
int ans = -1000000009;
qsort(nums, numsSize, sizeof(int), comp);
ans = Max(ans, threeNegative(nums, numsSize)); // (1)
ans = Max(ans, twoNegative(nums, numsSize)); // (2)
ans = Max(ans, oneNegative(nums, numsSize)); // (3)
ans = Max(ans, zeroNegative(nums, numsSize)); // (4)
return ans;
}
- ( 1 ) (1) (1) 三个负数:排序后,找最接近零的三个数相乘;
- ( 2 ) (2) (2) 两个负数:最大的正数、最小的两个负数;
- ( 3 ) (3) (3) 一个负数:最小的两个正数、最接近零的负数;
- ( 4 ) (4) (4) 零个负数:最大的三个正数相乘。
三、本题小知识
线性枚举的问题,刚开始处理的时候,可以先对数组进行一次排序,有序数组解决时,思路会轻松许多。
以上是关于⭐算法入门⭐《线性枚举》中等02 —— LeetCode 628. 三个数的最大乘积的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《线性枚举》中等03 —— LeetCode 27. 移除元素
⭐算法入门⭐《二分枚举》中等02 —— LeetCode 面试题 10.09. 排序矩阵查找
⭐算法入门⭐《二分枚举》中等01 —— LeetCode 面试题 16.21. 交换和
⭐算法入门⭐《二分枚举》中等05 —— LeetCode 1201. 丑数 III