📅  最后修改于: 2023-12-03 14:59:38.894000             🧑  作者: Mango
给定一个由非负整数组成的数组,计算两个数的最大乘积,使得这两个数在数组中不重叠。也就是说,不能选择同一个下标的元素。
long long max_product(int* nums, int numsSize);
nums
:输入的数组,长度不大于 1000
,元素为非负整数。numsSize
:数组的长度。函数应该返回最大乘积,类型为 long long
。
int nums[] = {10, 2, 5, 2};
int numsSize = 4;
long long res = max_product(nums, numsSize); // 50
该问题可以通过遍历数组寻找最大值和次大值的方法解决。这里先定义两个变量 max1
和 max2
,分别表示数组中的最大值和次大值,初始化为最小的 long long
值(这里选取 LLONG_MIN
,它定义在 limits.h
中)。然后遍历数组,如果当前元素大于等于 max1
,则将 max2
赋值为 max1
,max1
赋值为当前元素,否则如果当前元素大于等于 max2
,则将 max2
赋值为当前元素。最后我们只需返回 max1 * max2
的值,即为最大乘积。
#include <limits.h>
long long max_product(int* nums, int numsSize) {
long long max1 = LLONG_MIN, max2 = LLONG_MIN; // LLONG_MIN 为 long long 的最小值
for (int i = 0; i < numsSize; ++i) {
if (nums[i] >= max1) {
max2 = max1;
max1 = nums[i];
} else if (nums[i] >= max2) {
max2 = nums[i];
}
}
return max1 * max2;
}
遍历一遍数组,时间复杂度为 $O(n)$。
只用到了常数个变量,空间复杂度为 $O(1)$。