博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays
阅读量:7217 次
发布时间:2019-06-29

本文共 2066 字,大约阅读时间需要 6 分钟。

给定数组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 = 0        for i in range(k - 1, len(s)):            if a[i] > a[ma]:                ma = i            ss[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 = 0        for i in range(k * 2 - 1, len(s)):            if sss[i] > sss[ma]:                ma = i            b[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 = 0        for i in range(k * 3 - 1, len(c)):            if c[i] > c[ans]:                ans = i        ret = [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)

转载地址:http://rrtym.baihongyu.com/

你可能感兴趣的文章
毕设开发日志2017-10-23
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
第二章 例题2-2 在屏幕上显示两个短句
查看>>
【转】iOS学习之适配iOS10
查看>>
OC语言BLOCK和协议
查看>>
C++创建一个动态链接库工程
查看>>
(六)maven之本地仓库
查看>>
如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
查看>>
CentOS7
查看>>
linux高编IO-------tmpnam和tmpfile临时文件
查看>>
微信的机器人开发
查看>>
从零开始学Java(二)基础概念——什么是"面向对象编程"?
查看>>
近期面试总结(2016.10)
查看>>
CodeForces 525D Arthur and Walls :只包含点和星的矩阵,需要将部分星变成点使满足点组成矩形 : dfs+思维...
查看>>
积累_前辈的推荐
查看>>
strcpy和memcpy的区别《转载》
查看>>
在windows平台下electron-builder实现前端程序的打包与自动更新
查看>>
DroidPilot V2.1 手写功能特别版
查看>>
COOKIE欺骗
查看>>
js 强转规范解读
查看>>