最大乘积,最大和---------连续子数组

最大连续乘积子数组

在这里插入图片描述

遍历数组时计算当前最大值,不断更新
令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i], nums[i])
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,imin = min(imin * nums[i], nums[i])
当负数出现时则imax与imin进行交换再进行下一步计算
时间复杂度:O(n)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int ans =  -999999999;  //这个是用来保存最大值
        int Max=1,Min=1;   //这里都设置为1 ,原因在下面两行max,min函数中
        for(int i=0;i<nums.size();++i){
            if(nums[i]<0){
                Max^=Min^=Max^=Min;
            }
            Max = max(Max*nums[i],nums[i]);
            Min = min(Min*nums[i],nums[i]);

            ans = max(ans,Max);
        }
        return ans;
    }
};
最大连续子数组和

在这里插入图片描述
思路:

这里只要一个循环就搞定,从头到尾遍历,用一个变量记录num当前所到的值是正数还是负数,如果是负数,就直接把之前的值去掉,把当前的值赋值给num变量即可,然后用一个全局变量保存最大值。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int ans=-99999999;
        int num=0;
        for(int i=0;i<nums.size();++i){
            if(num < 0){
                num  = nums[i];
            }else{
                num += nums[i];
            }
            if(ans<num){
                ans = num;
            }
        }
        return ans;
    }
};

力扣上还有一种复杂的解法,可以学习了解,就是线段树的原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值