首页 > 编程语言 > 详细

leetcode-28双周赛-5428-找两个和为目标值且不重叠的子数组

时间:2020-06-15 12:09:19      阅读:33      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 方法一:dp+前缀和 O(N)

class Solution:
    def minSumOfLengths(self, arr: List[int], target: int) -> int:
        n = len(arr)
        # dp[i]记录从第i个元素(包含第i个)往前找到的和为target最短子数组长度
        dp = [float("inf")] * n
        sums, ans = 0, float("inf")
        # sum_record记录和为target的子数组位置
        sum_record = {0: -1}
        for i, num in enumerate(arr):
            sums += num
            dp[i] = dp[i-1]
            if sums - target in sum_record:
                cur_len = i - sum_record[sums-target]
                if i - cur_len >= 0:
                    ans = min(ans, cur_len + dp[i-cur_len])
                dp[i] = min(dp[i-1], cur_len)
            sum_record[sums] = i
        return ans if ans != float("inf") else -1

 

leetcode-28双周赛-5428-找两个和为目标值且不重叠的子数组

原文:https://www.cnblogs.com/oldby/p/13129572.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!