数组:leetcode3364.最小正和子数组

4 阅读1分钟

1.题目描述

给你一个整数数组 nums 和 两个 整数 l 和 r。你的任务是找到一个长度在 l 和 r 之间(包含)且和大于 0 的 子数组 的 最小 和。

返回满足条件的子数组的 最小 和。如果不存在这样的子数组,则返回 -1。

子数组 是数组中的一个连续 非空 元素序列。

  示例 1:

输入:  nums = [3, -2, 1, 4], l = 2, r = 3

输出:  1

解释: 长度在 l = 2 和 r = 3 之间且和大于 0 的子数组有:

  • [3, -2] 和为 1
  • [1, 4] 和为 5
  • [3, -2, 1] 和为 2
  • [-2, 1, 4] 和为 3

其中,子数组 [3, -2] 的和为 1,是所有正和中最小的。因此,答案为 1。

示例 2:

输入:  nums = [-2, 2, -3, 1], l = 2, r = 3

输出:  -1

解释: 不存在长度在 l 和 r 之间且和大于 0 的子数组。因此,答案为 -1。

示例 3:

输入:  nums = [1, 2, 3, 4], l = 2, r = 4

输出:  3

解释: 子数组 [1, 2] 的长度为 2,和为 3,是所有正和中最小的。因此,答案为 3。

2.代码实现:滑动窗口

class Solution {
public:
    int minimumSumSubarray(vector<int>& nums, int l, int r) {
        
        int min_sum = INT_MAX;
        //枚举长度符合要求的[l,r]
        for(int len = l;len<=r;len++)
        {
            int cur_sum = 0;

            for(int i=0;i<len;i++)
            {
                cur_sum +=nums[i];

            }
            if(cur_sum >0)
            {
                min_sum = min(min_sum,cur_sum);
            }

            //滑动窗口
            for(int i=len;i<nums.size();i++)
            {
                cur_sum +=nums[i] - nums[i-len];//滑动一步
                if(cur_sum >0)
                {
                    min_sum = min(min_sum,cur_sum);
                }
            }


        }
        return min_sum ==INT_MAX?-1:min_sum;
    }
};