425 周赛第一题 3364. 最小正和子数组

 

 

 

给你一个整数数组 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。

 

复制代码
class Solution:
    def minimumSumSubarray(self, nums: List[int], l: int, r: int) -> int:

        length = len(nums)

        pre = [0] * (length+1)

        for i,n in enumerate(nums):
            pre[i+1] = pre[i] + n
        
        ans = -1
        for ll in range(l,r+1):
            for i in range(length):
                if i+ll <= length:
                    temp_ans = pre[i+ll] - pre[i]
                    if temp_ans>0:
                        if ans==-1:
                            ans = temp_ans
                        else:
                            ans = min(temp_ans,ans)
                        if temp_ans==1:
                            return 1
        return ans


        
复制代码

 

posted @   xiaoxinlong  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
AmazingCounters.com
点击右上角即可分享
微信分享提示