0
点赞
收藏
分享

微信扫一扫

HTTP 常用状态码 301 302 304 403

江南北 2023-08-11 阅读 16

1.最大子数组和   力扣

class Solution {
    const int INF=0x3f3f3f3f;
public:
    int maxSubArray(vector<int>& nums) 
    {
        int n=nums.size();
        vector<int> dp(n+1);
        int ret=-INF;
        for(int i=1;i<=n;i++)
        {
            dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);
            ret=max(ret,dp[i]);//不能从dp[0]开始找,从dp[1]开始找
        }
        
        return ret;
    }
};

2.环形子数组最大和 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    const int INF = 0x3f3f3f3f;
public:
    int maxSubarraySumCircular(vector<int>& nums)
    {
        int n = nums.size();
        int sum = 0;
        for (auto sh : nums) sum += sh;
        vector<int> f(n + 1);//找最大值
        vector<int> g(n + 1);//找最小值

        int retmax = -INF;
        int retmin = INF;

        for (int i = 1; i <= n; i++)
        {
            f[i] = max(nums[i - 1], f[i - 1] + nums[i - 1]);
            retmax = max(retmax, f[i]);

            g[i] = min(nums[i - 1], g[i - 1] + nums[i - 1]);
            retmin = min(retmin, g[i]);
        }
        
        /*if(sum-retmin==0)
            return retmax;
        return retmax == retmin ? retmax : max(retmax, sum - retmin);*/
        return retmax == retmin ? retmax : max(retmax, sum - retmin==0?retmax:sum-retmin);   
    }
};

3.乘积最大子数组 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
public:
    int maxProduct(vector<int>& nums)
    {
        int n=nums.size();
        vector<int> f(n+1);
        auto g=f;
        int ret=INT_MIN;
        int retmin=INT_MAX;

        f[0]=g[0]=1;
        

        for(int i=1;i<=n;i++)
        {
            f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));
            ret=max(ret,f[i]);//不能从dp[0]开始找,从dp[1]开始找
            g[i]=min(nums[i-1],min(g[i-1]*nums[i-1],f[i-1]*nums[i-1]));
            retmin=min(retmin,g[i]);
        }
        
        return ret;
    }
};

4.成绩为正数的最长子数组长度  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
public:
    int getMaxLen(vector<int>& nums) 
    {
        int n=nums.size();
        vector<int> f(n+1);
        auto g=f;
    
        int ret=INT_MIN;
        for(int i=1;i<=n;i++)
        {
            if(nums[i-1]>0)//正数
            {
                f[i]=f[i-1]+1;
                g[i]=g[i-1]==0?0:g[i-1]+1;
            }
            else if(nums[i-1]<0)//负数
            {
                f[i]=g[i-1]==0?0:g[i-1]+1;
                g[i]=f[i-1]+1;
            }
            ret=max(ret,f[i]);
        }
        return ret;
    }
};

5.等差数列划分  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) 
    {
        int n=nums.size();
        int dp[2]={0};
        int sum=0;
        for(int i=2;i<n;i++)
        {
            
            dp[i%2]=nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[(i-1)%2]+1:0;
            
            sum+=dp[i%2];
        }
        return sum;
    }
};

6.最长湍流子数组  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) 
    {
        int n=arr.size();
        vector<int> f(n,1);
        auto g=f;
        int ret=1;
        for(int i=1;i<n;i++)
        {
            if(arr[i]>arr[i-1])
            {
                f[i]=g[i-1]+1;
            }
            else if(arr[i]<arr[i-1])
            {
                g[i]=f[i-1]+1;
            }
            ret=max(ret,max(g[i],f[i]));
        }
        return ret;
    }
};
举报

相关推荐

0 条评论