饭后小甜点leetcode——子数组系列

本文针对子数组问题进行了详细的解析,包括求最大子数组和、最大子数组乘积等经典问题,并提供了具体的代码实现。此外还介绍了如何使用滑动窗口解决求和为特定值的子数组问题。


在数组这儿的题中,发现有很多很多题都跟子数组有关,现总结一下子数组相关题型。

求最大/小子数组和/积

这种题一般用DP解决比较方便,dp数组中保存以i为结尾的子数组的和/积

求最大子数组和

leetcode题目地址
很基础的DP

public int MaxSubArray(int[] nums)
{
     if (nums.Length == 0) return 0;
     var dp = nums[0];
     var max = dp;
     for (var i = 1; i < nums.Length; i++)
     {
         dp = Math.Max(nums[i], dp + nums[i]);
         max = Math.Max(dp, max);
     }
     return max;
 }

求最大子数组乘积

leetcode题目地址

public int MaxProduct(int[] nums)
{
    if (nums == null || nums.Length == 0) return 0;
    var dpPos = Math.Max(nums[0], 0);//直接用变量存dp阶段值
    var dpNeg = Math.Min(nums[0], 0);
    var max = nums[0];//因为题目要求至少包含一个数,所以此处应该赋值为nums[0]
    for (var i = 1; i < nums.Length; i++)
    {
        if (nums[i] >= 0)
        {
            dpPos = Math.Max(dpPos * nums[i], nums[i]);
            dpNeg = Math.Min(dpNeg * nums[i], nums[i]);
        }
        else
        {
            var temp = dpPos;//注意此处,因为直接用变量存上一个状态,下一句会改掉本来的dpPos值,会影响到下下一句,所以先把dpPos原本的值拎出来
            dpPos = Math.Max(dpNeg * nums[i], nums[i]);
            dpNeg = Math.Min(temp * nums[i], nums[i]);
        }
        max = Math.Max(max, dpPos);
    }
    return max;
}

用滑动窗口

见另一篇文章,滑动窗口

求和为k的子数组

这道题是从两数之和衍生出来的,见另一篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值