leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays
给定数组a[N](每个元素都是正整数)和一个整数k(k小于等于N/3),要求从数组a中找出不相交的三个数组,每个数组长度都为k,使得三个数组之和最大。输出(i,j,k)表示三个子数组的开始下标,如果有多个答案,返回最小的那个三元组。
分析:
这个问题是前缀和的“花式玩法”,也可以看做是动态规划。
定义数组s[N],s[i]表示sum(a[i-k+1]~a[i])
定义数组ss[N],ss[i]表示sum(a[i-k+1]~a[i])+max(s[0~(i-k)]),也就是i前面的两个片段最大和,且第二个片段以i结尾。
定义数组sss[N],sss[i]表示i前面的三个片段最大和,且第二个片段以i结尾。
这个问题时空复杂度都为O(N)。
这个问题还有一种简洁的解法,原因在于3的特殊性。
什么是“三”,三就是左边一片,右边一片,中间一片。
定义left数组,left[i]表示i左面最大的片段
定义right数组,right[i]表示i右面最大的片段
定义ans数组,ans[i]为中间一片、左边一片、右边一片之和,也就是ans[i]=s[i]+left[i-k]+right[i+1]
任何事物,如果要想找到它的简便方法,就必须应用上这个事物的特殊性。
class Solution:def maxSumOfThreeSubarrays(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""# print(nums)#前缀和s = [0] * len(nums)s[0] = nums[0]for i in range(1, len(s)):s[i] = s[i - 1] + nums[i]# print('s', s) a = [0] * len(nums)a[k - 1] = s[k - 1]for i in range(k, len(s)):a[i] = s[i] - s[i - k]# print('a', a)#最大前缀和ss = [0] * len(nums)ma = 0for i in range(k - 1, len(s)):if a[i] > a[ma]:ma = iss[i] = (a[ma], ma)# print('ss',ss)sss = [0] * len(nums)for i in range(k * 2 - 1, len(s)):sss[i] = a[i] + ss[i - k][0]# print('sss',sss)#二级最大前缀和b = [0] * len(nums)ma = 0for i in range(k * 2 - 1, len(s)):if sss[i] > sss[ma]:ma = ib[i] = (sss[ma], ma)# print('b',b)#三级前缀和c = [0] * len(nums)for i in range(k * 3 - 1, len(s)):c[i] = a[i] + b[i - k][0]# print('c',c)ans = 0for i in range(k * 3 - 1, len(c)):if c[i] > c[ans]:ans = iret = [0, 0, ans]ret[1] = b[ret[2] - k][1]ret[0] = ss[ret[1] - k][1]ret = list(map(lambda i: i - k+1, ret))return retif __name__ == '__main__':ans = Solution().maxSumOfThreeSubarrays([1,2,1,2,6,7,5,1], 2)print(ans)
转载于:https://www.cnblogs.com/weiyinfu/p/7636061.html
leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays相关推荐
- [Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays...
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- URAL 1146 Maximum Sum(最大子矩阵的和 DP)
Maximum Sum 大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少. 思路:最開始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4).就不知道该怎么办了.问了一下,是压缩矩阵,转 ...
- NOIP前夕:noi.openjudge,Maximum sum
Maximum sum 总Time Limit: 1000msMemory Limit: 65536kB Description Given a set of n integers: A={a1, a ...
- 简单英文题 16 Maximum Sum Not Exceeding K(python)
http://noi.openjudge.cn/english/16/ """ 简单英文题 16 Maximum Sum Not Exceeding K(AC) http ...
- !!!---1588|Sum of All Odd Length Subarrays(新)
1588. 所有奇数长度子数组的和 Given an array of positive integers arr(正整数), calculate(计算) the sum of all possibl ...
- D28:Maximum sum(最大和,翻译)
原题:OpenJudge - 1481:Maximum sum 翻译: 描述:给定一组n个整数:A={a1,a2,...,an},我们定义函数d(A)如下: t1 t2 d(A) = max{ ∑ai ...
- 英语翻译 Maximum sum
OpenJudge - 1481:Maximum sum 2022 2.10 Given a set of n integers: A={a1, a2,..., an}, we define a fu ...
- SPOJ KGSS Maximum Sum (线段树)
SPOJ KGSS Maximum Sum 题意:求区间最大值与第二大值之和 思路:线段树维护两个最大值 /********************************************** ...
- 689 Maximum Sum of 3 Non-Overlapping Subarrays
题目 思路:首先是长度为k的子数组的和.这个好计算.题目要求返回的是三个和最大的子数组的第一个数字的下标.下标要尽可能小.如果只要求这样,题目就很简单了.还有个要求是各个子数组不重叠.要想不重叠首先得 ...
最新文章
- python批量pdf转word,python批量实现Word文件转换为PDF文件
- activity中fragment 返回键不退出_分享一波阿里Android客户端面经,我竟连这都答不上来?...
- Sql Server 2005如何设置连接加密
- arcgis批量裁剪矢量模型
- vue抽屉_VUE组件 之 Drawer 抽屉
- python3迭代器和可迭代对象,Python3学习(8)--迭代,可迭代的和迭代器
- 这套GitHub 1300星的NLP课程即将完结,视频授课,在线答疑丨课程
- 小心了!一大波存储厂商术语正在靠近
- ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
- 【剑指offer】面试题17、合并两个排序的链表
- 关于码云的一些基本知识_关于使用码云,GITHUB,阿里云CODE来管理代码的一些操作记录...
- 人工智能之产生式系统
- 小米游戏本bios_年轻人的第一台游戏本?——小米游戏本2019评测
- 链新:探索NFT中国化路径,与实体经济相结合
- Maven setting文件配置错误:Non-parseable settings..in comment after two dashes (--) next character must be
- 莫言领取诺贝尔文学奖演讲稿(中英文)----讲故事的人
- Spring Boot 实践折腾记(10):响应式编程支持库Reactor
- Set 中 toArray()
- 计算机选购配置项目活动,笔记本电脑选购活动计划.doc
- 软件测试 | 白盒的测试方法
热门文章
- h5 移动端 监听软键盘弹起、收起
- Spring Boot Questions- Part 1
- 纯CSS3实现打火机火焰动画
- js中的call和apply方法的区别
- 仿头条新闻app,实现下拉刷新,上拉加载分页
- 淘宝店的图片哪里来的
- 1、linux网络服务实验 用PuTTY连接Linux
- java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.getMergedRegion
- 数据结构之字符串反转
- B/S应用中的ActiveX数字签名相关问题杂谈