📜  C |运营商|问题2(1)

📅  最后修改于: 2023-12-03 14:59:38.894000             🧑  作者: Mango

C | 运营商问题2

问题描述

给定一个由非负整数组成的数组,计算两个数的最大乘积,使得这两个数在数组中不重叠。也就是说,不能选择同一个下标的元素。

函数原型
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
分析

该问题可以通过遍历数组寻找最大值和次大值的方法解决。这里先定义两个变量 max1max2,分别表示数组中的最大值和次大值,初始化为最小的 long long 值(这里选取 LLONG_MIN,它定义在 limits.h 中)。然后遍历数组,如果当前元素大于等于 max1,则将 max2 赋值为 max1max1 赋值为当前元素,否则如果当前元素大于等于 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)$。