• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

c++ 子数组动态规划问题

武飞扬头像
函数指针
帮助1

1.最大子数组和   力扣

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23
  1.  
    class Solution {
  2.  
    const int INF=0x3f3f3f3f;
  3.  
    public:
  4.  
    int maxSubArray(vector<int>& nums)
  5.  
    {
  6.  
    int n=nums.size();
  7.  
    vector<int> dp(n 1);
  8.  
    int ret=-INF;
  9.  
    for(int i=1;i<=n;i )
  10.  
    {
  11.  
    dp[i]=max(nums[i-1],dp[i-1] nums[i-1]);
  12.  
    ret=max(ret,dp[i]);//不能从dp[0]开始找,从dp[1]开始找
  13.  
    }
  14.  
     
  15.  
    return ret;
  16.  
    }
  17.  
    };
学新通

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

给定一个长度为 n环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 

环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i 1) % n]nums[i] 的前一个元素是 nums[(i - 1 n) % n]

子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i 1], ..., nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。

示例 1:

输入:nums = [1,-2,3,-2]
输出:3
解释:从子数组 [3] 得到最大和 3

示例 2:

输入:nums = [5,-3,5]
输出:10
解释:从子数组 [5,5] 得到最大和 5   5 = 10

示例 3:

输入:nums = [3,-2,2,-3]
输出:3
解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3
  1.  
    class Solution {
  2.  
    const int INF = 0x3f3f3f3f;
  3.  
    public:
  4.  
    int maxSubarraySumCircular(vector<int>& nums)
  5.  
    {
  6.  
    int n = nums.size();
  7.  
    int sum = 0;
  8.  
    for (auto sh : nums) sum = sh;
  9.  
    vector<int> f(n 1);//找最大值
  10.  
    vector<int> g(n 1);//找最小值
  11.  
     
  12.  
    int retmax = -INF;
  13.  
    int retmin = INF;
  14.  
     
  15.  
    for (int i = 1; i <= n; i )
  16.  
    {
  17.  
    f[i] = max(nums[i - 1], f[i - 1] nums[i - 1]);
  18.  
    retmax = max(retmax, f[i]);
  19.  
     
  20.  
    g[i] = min(nums[i - 1], g[i - 1] nums[i - 1]);
  21.  
    retmin = min(retmin, g[i]);
  22.  
    }
  23.  
     
  24.  
    /*if(sum-retmin==0)
  25.  
    return retmax;
  26.  
    return retmax == retmin ? retmax : max(retmax, sum - retmin);*/
  27.  
    return retmax == retmin ? retmax : max(retmax, sum - retmin==0?retmax:sum-retmin);
  28.  
    }
  29.  
    };
  30.  
     
学新通

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

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
  1.  
    class Solution {
  2.  
    public:
  3.  
    int maxProduct(vector<int>& nums)
  4.  
    {
  5.  
    int n=nums.size();
  6.  
    vector<int> f(n 1);
  7.  
    auto g=f;
  8.  
    int ret=INT_MIN;
  9.  
    int retmin=INT_MAX;
  10.  
     
  11.  
    f[0]=g[0]=1;
  12.  
     
  13.  
     
  14.  
    for(int i=1;i<=n;i )
  15.  
    {
  16.  
    f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));
  17.  
    ret=max(ret,f[i]);//不能从dp[0]开始找,从dp[1]开始找
  18.  
    g[i]=min(nums[i-1],min(g[i-1]*nums[i-1],f[i-1]*nums[i-1]));
  19.  
    retmin=min(retmin,g[i]);
  20.  
    }
  21.  
     
  22.  
    return ret;
  23.  
    }
  24.  
    };
学新通

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

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度。

示例  1:

输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24 。

示例 2:

输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。
注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。

示例 3:

输入:nums = [-1,-2,-3,0,1]
输出:2
解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 
  1.  
    class Solution {
  2.  
    public:
  3.  
    int getMaxLen(vector<int>& nums)
  4.  
    {
  5.  
    int n=nums.size();
  6.  
    vector<int> f(n 1);
  7.  
    auto g=f;
  8.  
     
  9.  
    int ret=INT_MIN;
  10.  
    for(int i=1;i<=n;i )
  11.  
    {
  12.  
    if(nums[i-1]>0)//正数
  13.  
    {
  14.  
    f[i]=f[i-1] 1;
  15.  
    g[i]=g[i-1]==0?0:g[i-1] 1;
  16.  
    }
  17.  
    else if(nums[i-1]<0)//负数
  18.  
    {
  19.  
    f[i]=g[i-1]==0?0:g[i-1] 1;
  20.  
    g[i]=f[i-1] 1;
  21.  
    }
  22.  
    ret=max(ret,f[i]);
  23.  
    }
  24.  
    return ret;
  25.  
    }
  26.  
    };
学新通

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

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

  • 例如,[1,3,5,7,9][7,7,7,7][3,-1,-5,-9] 都是等差数列。

给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

示例 1:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。

示例 2:

输入:nums = [1]
输出:0
  1.  
    class Solution {
  2.  
    public:
  3.  
    int numberOfArithmeticSlices(vector<int>& nums)
  4.  
    {
  5.  
    int n=nums.size();
  6.  
    int dp[2]={0};
  7.  
    int sum=0;
  8.  
    for(int i=2;i<n;i )
  9.  
    {
  10.  
     
  11.  
    dp[i%2]=nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[(i-1)%2] 1:0;
  12.  
     
  13.  
    sum =dp[i%2];
  14.  
    }
  15.  
    return sum;
  16.  
    }
  17.  
    };
学新通

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

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 

如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。

更正式地来说,当 arr 的子数组 A[i], A[i 1], ..., A[j] 满足仅满足下列条件时,我们称其为湍流子数组

  • 若 i <= k < j :
    • k 为奇数时, A[k] > A[k 1],且
    • k 为偶数时,A[k] < A[k 1]
  • 若 i <= k < j :
    • k 为偶数时,A[k] > A[k 1] ,且
    • k 为奇数时, A[k] < A[k 1]

示例 1:

输入:arr = [9,4,2,10,7,8,8,1,9]
输出:5
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]

示例 2:

输入:arr = [4,8,12,16]
输出:2

示例 3:

输入:arr = [100]
输出:1
  1.  
    class Solution {
  2.  
    public:
  3.  
    int maxTurbulenceSize(vector<int>& arr)
  4.  
    {
  5.  
    int n=arr.size();
  6.  
    vector<int> f(n,1);
  7.  
    auto g=f;
  8.  
    int ret=1;
  9.  
    for(int i=1;i<n;i )
  10.  
    {
  11.  
    if(arr[i]>arr[i-1])
  12.  
    {
  13.  
    f[i]=g[i-1] 1;
  14.  
    }
  15.  
    else if(arr[i]<arr[i-1])
  16.  
    {
  17.  
    g[i]=f[i-1] 1;
  18.  
    }
  19.  
    ret=max(ret,max(g[i],f[i]));
  20.  
    }
  21.  
    return ret;
  22.  
    }
  23.  
    };
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggbcia
系列文章
更多 icon
同类精品
更多 icon
继续加载