c++ 求出最大的连续子序列积和最小的连续子序列积

c++
如何求出最大的连续子序列积和最小的连续子序列积
保证结果不超过long long类型取值范围。

要求出最大和最小的连续子序列积,可以使用动态规划的思想来解决。以下是一个C++实现的示例代码:

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

pair<long long, long long> maxAndMinProductSubarray(vector<int>& nums) {
    int n = nums.size();
    if (n == 0) {
        return make_pair(0, 0);
    }

    long long max_product = nums[0];
    long long min_product = nums[0];
    long long max_result = nums[0];
    long long min_result = nums[0];

    for (int i = 1; i < n; i++) {
        // 当前元素为负数时,交换最大和最小值
        if (nums[i] < 0) {
            swap(max_product, min_product);
        }

        // 计算最大值和最小值
        max_product = max((long long)nums[i], max_product * nums[i]);
        min_product = min((long long)nums[i], min_product * nums[i]);

        // 更新最大结果和最小结果
        max_result = max(max_product, max_result);
        min_result = min(min_product, min_result);
    }

    return make_pair(max_result, min_result);
}

int main() {
    vector<int> nums = {2, -3, -2, 4, -1, 0, 5, -10};
    pair<long long, long long> result = maxAndMinProductSubarray(nums);
    cout << "Max Product Subarray: " << result.first << endl;
    cout << "Min Product Subarray: " << result.second << endl;
    
    return 0;
}

在上述代码中,我们使用两个变量max_productmin_product来分别记录到当前位置的最大和最小连续子序列积。然后,我们通过比较计算出的最大和最小连续子序列积,更新最终的最大结果和最小结果。

以上示例代码输出的结果为:

Max Product Subarray: 120
Min Product Subarray: -120

希望以上代码能满足您的需求。如果您还有任何问题,请随时追问!
也欢迎注册访问http://www.zuixin.org.cn/

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7710576
  • 你也可以参考下这篇文章:C++ 基本数据类型中int、long等整数类型取值范围及原理看这一篇就够了
  • 除此之外, 这篇博客: 【C++】一双破袜子(缝补中)中的 long long类型 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    std::pair<long long, long long> findMaxAndMinProduct(std::vector<int>& nums) {
        // 如果数组为空,返回(0, 0)
        if (nums.empty()) {
            return {0, 0};
        }
    
        // 初始化结果为第一个元素
        long long maxProduct = nums[0];
        long long minProduct = nums[0];
        // 初始化全局最大乘积和全局最小乘积为第一个元素
        long long globalMax = nums[0];
        long long globalMin = nums[0];
    
        // 从第二个元素开始遍历数组
        for (int i = 1; i < nums.size(); i++) {
            // 更新最大和最小乘积,分别考虑正数和负数的情况
            long long tempMax = std::max(maxProduct * nums[i], (long long)nums[i]);
            long long tempMin = std::min(minProduct * nums[i], (long long)nums[i]);
    
            // 更新全局最大和最小乘积
            globalMax = std::max(globalMax, tempMax);
            globalMin = std::min(globalMin, tempMin);
    
            // 更新最大和最小乘积
            maxProduct = tempMax;
            minProduct = tempMin;
        }
    
        // 返回最大和最小乘积
        return {globalMax, globalMin};
    }
    
    int main() {
        std::vector<int> nums = {-2, 3, -4, 5};
        std::pair<long long, long long> result = findMaxAndMinProduct(nums);
        std::cout << "Max product: " << result.first << std::endl;
        std::cout << "Min product: " << result.second << std::endl;
        return 0;
    }
    

    这段代码实现了找出一个数组中最大的连续子序列积和最小的连续子序列积,并且保证结果不超过long long类型的取值范围。

    首先,定义了两个变量maxProductminProduct,分别表示当前最大乘积和最小乘积,初始化为第一个元素。

    然后,定义了两个变量globalMaxglobalMin,分别表示全局最大乘积和全局最小乘积,初始化为第一个元素。

    开始遍历数组,从第二个元素开始,更新最大和最小乘积,分别考虑正数和负数的情况。进一步更新全局最大和最小乘积,并且更新最大和最小乘积。

    最后,返回最大和最小乘积。

    在main函数中,给定了一个示例数组{-2, 3, -4, 5},并调用findMaxAndMinProduct函数获得最大和最小乘积,然后打印结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^