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

 

 方法一: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

 

posted @ 2020-06-15 10:42  oldby  阅读(253)  评论(0编辑  收藏  举报