★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/10744670.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Given an array A of non-negative integers, return the maximum sum of elements in two non-overlapping (contiguous) subarrays, which have lengths L and M.  (For clarification, the L-length subarray could occur before or after the M-length subarray.)

Formally, return the largest V for which V = (A[i] + A[i+1] + ... + A[i+L-1]) + (A[j] + A[j+1] + ... + A[j+M-1]) and either:

  • 0 <= i < i + L - 1 < j < j + M - 1 < A.length, or
  • 0 <= j < j + M - 1 < i < i + L - 1 < A.length.

Example 1:

Input: A = [0,6,5,2,2,5,1,9,4], L = 1, M = 2
Output: 20
Explanation: One choice of subarrays is [9] with length 1, and [6,5] with length 2.

Example 2:

Input: A = [3,8,1,3,2,1,8,9,0], L = 3, M = 2
Output: 29
Explanation: One choice of subarrays is [3,8,1] with length 3, and [8,9] with length 2.

Example 3:

Input: A = [2,1,5,6,0,9,5,0,3,8], L = 4, M = 3
Output: 31
Explanation: One choice of subarrays is [5,6,0,9] with length 4, and [3,8] with length 3.

Note:

  1. L >= 1
  2. M >= 1
  3. L + M <= A.length <= 1000
  4. 0 <= A[i] <= 1000

给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M。(这里需要澄清的是,长为 L 的子数组可以出现在长为 M 的子数组之前或之后。)

从形式上看,返回最大的 V,而 V = (A[i] + A[i+1] + ... + A[i+L-1]) + (A[j] + A[j+1] + ... + A[j+M-1]) 并满足下列条件之一:

  • 0 <= i < i + L - 1 < j < j + M - 1 < A.length, 或
  • 0 <= j < j + M - 1 < i < i + L - 1 < A.length.

示例 1:

输入:A = [0,6,5,2,2,5,1,9,4], L = 1, M = 2
输出:20
解释:子数组的一种选择中,[9] 长度为 1,[6,5] 长度为 2。

示例 2:

输入:A = [3,8,1,3,2,1,8,9,0], L = 3, M = 2
输出:29
解释:子数组的一种选择中,[3,8,1] 长度为 3,[8,9] 长度为 2。

示例 3:

输入:A = [2,1,5,6,0,9,5,0,3,8], L = 4, M = 3
输出:31
解释:子数组的一种选择中,[5,6,0,9] 长度为 4,[0,3,8] 长度为 3。

提示:

  1. L >= 1
  2. M >= 1
  3. L + M <= A.length <= 1000
  4. 0 <= A[i] <= 1000

Runtime: 24 ms
Memory Usage: 19.1 MB
 1 class Solution {
 2     let N:Int = 1010
 3     var prefix:[Int] = [Int](repeating:0,count:1010)
 4     func maxSumTwoNoOverlap(_ A: [Int], _ L: Int, _ M: Int) -> Int {
 5         var n:Int = A.count
 6         for i in 1...n
 7         {
 8             prefix[i] = prefix[i - 1] + A[i - 1]
 9         }
10         var ans:Int = 0
11         var best_l:Int = 0
12         for i in (L + M)...n
13         {
14             best_l = max(best_l, prefix[i - M] - prefix[i - M - L])
15             ans = max(ans, best_l + prefix[i] - prefix[i - M])
16         }
17         var best_m:Int = 0
18         for i in (L + M)...n
19         {
20             best_m = max(best_m, prefix[i - L] - prefix[i - M - L])
21             ans = max(ans, best_m + prefix[i] - prefix[i - L])
22         }
23         return ans
24     }
25 }


24ms 
 1 class Solution {
 2     func maxSumTwoNoOverlap(_ A: [Int], _ L: Int, _ M: Int) -> Int {
 3         var leftMax = [Int](repeating: 0, count: A.count)
 4         var curMax = 0, curSum = 0
 5         for i in A.indices {
 6             curSum += i < M ?  A[i] : A[i] - A[i-M]
 7             curMax = max(curMax, curSum)
 8             leftMax[i] = curMax
 9         }
10
11         var rightMax = [Int](repeating: 0, count: A.count+1)
12         var i = A.count - 1, ans = 0
13         curMax = 0; curSum = 0
14         while i >= 0 {
15             curSum += (i + M > A.count - 1) ? A[i] : A[i] - A[i+M]
16             curMax = max(curMax, curSum)
17             rightMax[i] = curMax
18             i -= 1
19         }
20
21         curSum = 0
22         for i in A.indices {
23             curSum += i < L ?  A[i] : A[i] - A[i-L]
24             let leftMax =  i >= L ? leftMax[i-L] : 0
25             ans = max(ans, max(leftMax, rightMax[i+1]) + curSum)
26         }
27         return ans
28     }
29 }


84ms

 1 class Solution {
 2     func maxSumTwoNoOverlap(_ A: [Int], _ L: Int, _ M: Int) -> Int {
 3         var sumLs = [Int](repeating: 0, count: A.count)
 4         var sumMs = [Int](repeating: 0, count: A.count)
 5         var forwardMaxLs = [Int](repeating: 0, count: A.count)
 6         var backwardMaxLs = [Int](repeating: 0, count: A.count)
 7         var forwardMaxMs = [Int](repeating: 0, count: A.count)
 8         var backwardMaxMs = [Int](repeating: 0, count: A.count)
 9
10         var sumL = 0
11         var sumM = 0
12         for i in 0..<A.count {
13             sumL += A[i]
14             if i >= L - 1 {
15                 if i >= L {
16                     sumL -= A[i - L]
17                 }
18                 sumLs[i] = sumL
19             }
20             sumM += A[i]
21             if i >= M - 1 {
22                 if i >= M {
23                     sumM -= A[i - M]
24                 }
25                 sumMs[i] = sumM
26             }
27         }
28         var maxSumL = Int.min
29         var maxSumM = Int.min
30         for i in 0..<A.count {
31             maxSumL = max(maxSumL, sumLs[i])
32             forwardMaxLs[i] = maxSumL
33             maxSumM = max(maxSumM, sumMs[i])
34             forwardMaxMs[i] = maxSumM
35         }
36         maxSumL = Int.min
37         maxSumM = Int.min
38         for i in (0..<A.count).reversed() {
39             maxSumL = max(maxSumL, sumLs[i])
40             backwardMaxLs[i] = maxSumL
41             maxSumM = max(maxSumM, sumMs[i])
42             backwardMaxMs[i] = maxSumM
43         }
44         var maxSum = Int.min
45         for l in 0..<A.count {
46             var m = A.count - 1
47             while l <= m - M {
48                 maxSum = max(maxSum, forwardMaxLs[l] + backwardMaxMs[m])
49                 m -= 1
50             }
51         }
52         for m in 0..<A.count {
53             var l = A.count - 1
54             while m <= l - L {
55                 maxSum = max(maxSum, backwardMaxLs[l] + forwardMaxMs[m])
56                 l -= 1
57             }
58         }
59         return maxSum
60     }
61 }


108ms

 1 class Solution {
 2     func maxSumTwoNoOverlap(_ A: [Int], _ L: Int, _ M: Int) -> Int {
 3         var prefixSums: [Int] = [0]
 4         var sum = 0
 5         for num in A {
 6             sum += num
 7             prefixSums.append(sum)
 8         }
 9         var res = 0
10         for lRight in L..<prefixSums.count {
11             let lSum = prefixSums[lRight] - prefixSums[lRight - L]
12             for mRight in stride(from: lRight + M, to: prefixSums.count, by: 1) {
13                 let mSum = prefixSums[mRight] - prefixSums[mRight - M]
14                 let total = mSum + lSum
15                 res = max(res, total)
16             }
17
18             for mRight in stride(from: M, to: lRight - L, by: 1) {
19                 let mSum = prefixSums[mRight] - prefixSums[mRight - M]
20                 let total = mSum + lSum
21                 res = max(res, total)
22             }
23         }
24         return res
25     }
26 }

转载于:https://www.cnblogs.com/strengthen/p/10744670.html

[Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays...相关推荐

  1. 1031. 两个非重叠子数组的最大和-构造子数组和数组遍历数组

    1031. 两个非重叠子数组的最大和-构造子数组和数组遍历数组 给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M.(这里需要澄清的是,长为 L 的子数 ...

  2. LeetCode 1031. 两个非重叠子数组的最大和(一次遍历,要复习)*

    文章目录 1. 题目 2. 解题 2.1 暴力枚举 2.2 一次遍历 1. 题目 给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M.(这里需要澄清的是 ...

  3. 【LeetCode每日一题】【2021/12/8】689. 三个无重叠子数组的最大和

    文章目录 689. 三个无重叠子数组的最大和 方法1:滑动窗口 689. 三个无重叠子数组的最大和 LeetCode: 689. 三个无重叠子数组的最大和 困难\color{#EF4743}{困难}困 ...

  4. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  5. 【合并两个有序的子数组】算法实现

    [合并两个有序的子数组] View Code  1 #include<iostream.h>  2 void merge(int array[],int p,int q,int r,int ...

  6. 面试题31.连续子数组的最大和

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或者连续多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n) 本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但 ...

  7. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

  8. 微软面试题系列(三):求子数组的最大和

    题目大意: 输入一个×××数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 例如输入的数组为 1, ...

  9. LeetCode -- 剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 线性 DP 题. 针对于数组nums[i] 而言,以它为结尾的子数组分两种情况:(题目限制:必须是连续数组) num[i] 自身作为独立子数组:f[i] ...

最新文章

  1. PHP下载/采集远程图片到本地
  2. 2021.3.1 百度测试开发实习面试–百度地图一面
  3. URI和URLConnection类的区别
  4. 男人必看的46条忠告
  5. 互联网晚报 | 11月25日 星期四 | 花呗启动品牌隔离;小米MIUI全球月活用户突破5亿;《长津湖》成中国影史票房冠军...
  6. Qt笔记-解决QSocketNotifier: Multiple socket notifiers for same socket xxx and type Read问题
  7. 句句真研—每日长难句打卡Day3
  8. 使用Spring Boot CLI的Spring Boot Initilizr
  9. freemarker 解析对象的某元素_Freemarker常用技巧(三)
  10. FLEX 与JAVA的LCDS BLAZEDS配置.
  11. 设备指纹技术分析和应用分析
  12. html旅游网站设计与实现——绿色古典旅游景区 HTML+CSS+JavaScript
  13. 三种内存虚拟化技术(内存全虚拟化、内存半虚拟化、内存硬件辅助虚拟化),以及查看linux对ETP和VPID的支持情况
  14. java获取生僻字_生僻字与16进制的转换
  15. Winform(XtraReport)实现打印方法(转载)
  16. FastDFS和GFS以及NFS的对比
  17. DOM算法系列002-寻找指定DOM节点的上一个或下一个节点
  18. Windows 11正式发布,新功能太绝了!
  19. 虚拟机VMware安Mac OS时没有Apple mac选项
  20. 机械键盘恢复出厂fn,机械键盘构成-求助,机械键盘fn键的解决方法

热门文章

  1. 计算机网络——物理层2
  2. 1、什么是实际的电压源与电流源?
  3. ios在判断设备是ipad_识别您的 iPad 机型
  4. python实现简单的神经网络,python的神经网络编程
  5. 单点登录常见解决方式和阿里云短信服务
  6. 网易2017春招 魔力手环 矩阵快速幂
  7. Java中的空指针异常
  8. jmeter压测学习11-模拟浏览器访问web页面
  9. Unity3D性能优化——工具篇
  10. RTSP播放器高RTSP兼容推流网页无插件流媒体播放器EasyPlayer-RTSP关于MP4的封装调用流程介绍