题目
思路:首先是长度为k的子数组的和。这个好计算。题目要求返回的是三个和最大的子数组的第一个数字的下标。下标要尽可能小。如果只要求这样,题目就很简单了。还有个要求是各个子数组不重叠。要想不重叠首先得要求下标不重叠。子数组1下标是:0,1,2;子数组2下标如果是1,2,3那肯定会重叠。其次要计算出每个子数组的最大值,最小值。在找下个子数组的时候,范围不能在这之间。我应该是傻眼了。需要考虑的因素比较多。看别人怎么解吧。
学习:看了别人的解法,明白题目意思了解错了。不重叠的子数组就是指下标不重叠,而不是各个值不重叠。要返回的三个下标(idx1,idx2,idx3) 满足idx2>=idx1+kidx2>=idx1+kidx2>=idx1+k 并且 idx3>=idx2+kidx3>=idx2+kidx3>=idx2+k。
还要学习的一点是:当计算了长度为k的子数组的和,计算之后其实得到了一个sums的数组。sums[i]表示以i为起点的长度为k的子数组的和。sums的长度是n-k+1。如此看待问题会比较简单一些。
对于求这三个下标我一开始的做法是:

        int max1 = sums[0],max2 = sums[0+k],max3 = sums[0+2*k];int idx1 = 0,idx2 = k,idx3 = 2*k;for (i = 1; i < k; i++) {if (sums[i] > max1) {max1 = sums[i];idx1 = i;}if (i+k <n && sums[i+k] > max2) {max2 = sums[i+k];idx2 = i+k;}if (i+2*k < n && sums[i+2*k] > max3) {max3 = sums[i+2*k];idx3 = i+2*k;}}

这样做的问题是:可能idx2没有变化,idx1变化了。这样他们的差值就不是k,就不能符合条件了。所以需要固定idx2的位置。n=sums.length;那么idx1∈[0,idx2−k]idx1∈[0,idx2−k]idx1 \in [0,idx2-k] 并且 idx3∈[idx2+1,n−1]idx3∈[idx2+1,n−1]idx3 \in [idx2+1,n-1]。而idx2能够取值的范围是[k,n−k−1][k,n−k−1][k,n-k-1]。(n是原始数组长度)。

当idx2位置固定,对于idx1应该是[0,idx2-k]那个最大数的下标。这个问题可以用动态规划解决。用一个数组先保存从[0,当前位置]值最大的下标。动态转移方程式: 如果sums[i]>sums[left[i−1]]sums[i]>sums[left[i−1]]sums[i]>sums[left[i-1]],则left[i]=ileft[i]=ileft[i] = i;否则left[i]=left[i−1]left[i]=left[i−1]left[i] = left[i-1]。当然这里不用动态规划,那就每次循环一下从0到idx2-k找到最大值的下标。

右边也是一样。当idx2位置固定,对于idx3应该是[idx2+1,n-1]那个最大数的下标。用动态规划解决。用一个数组先保存从[当前位置,n-1]值最大的下标。动态转移方程式: 如果sums[i]>=sums[right[i+1]]sums[i]>=sums[right[i+1]]sums[i]>=sums[right[i+1]],则right[i]=iright[i]=iright[i] = i;否则right[i]=right[i+1]right[i]=right[i+1]right[i] = right[i+1]。这里的条件是>=>=>=是因为,结果要求返回下标最小值。

学习链接

public int[] maxSumOfThreeSubarrays(int[] nums, int k) {int n = nums.length;//计算和,因为入参都是正数,所以不需要初始化sums,否则可以都初始化为Integer.MIN_VALUE;int[] sums = new int[n];//这步可以优化//0,1 1,2  2,3 3,4  4,5 5,6int sum = 0;for (int i = 0; i <n; i++) {sum += nums[i];if(i>=k) sum -= nums[i-k];if(i>=k-1) sums[i-k+1] = sum; }//与左边的数组比较int[] left = new int[n-k+1];int best = 0;for(int i=0;i<left.length;i++){if(sums[i]>sums[best]) best = i;left[i] = best;}//跟右边的数组比较int[] right = new int[n-k+1];best = right.length - 1;for(int i = right.length -1;i>=0;i--){if(sums[i]>=sums[best]) best = i;right[i] = best;}int idx1 = -1,idx2 = -1,idx3 = -1;for (int j = k; j < right.length-k; j++) {int l = left[j-k],r = right[j+k];if(idx1==-1 || (sums[idx1]+sums[idx2]+sums[idx3] < sums[l]+sums[j]+sums[r])){idx1 = l;idx2 = j;idx3 = r;}}return new int[]{idx1,idx2,idx3};}

复杂度分析:时间复杂度O(n),空间复杂度O(n)。

689 Maximum Sum of 3 Non-Overlapping Subarrays相关推荐

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

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. URAL 1146 Maximum Sum(最大子矩阵的和 DP)

    Maximum Sum 大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少. 思路:最開始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4).就不知道该怎么办了.问了一下,是压缩矩阵,转 ...

  3. NOIP前夕:noi.openjudge,Maximum sum

    Maximum sum 总Time Limit: 1000msMemory Limit: 65536kB Description Given a set of n integers: A={a1, a ...

  4. 简单英文题 16 Maximum Sum Not Exceeding K(python)

    http://noi.openjudge.cn/english/16/ """ 简单英文题 16 Maximum Sum Not Exceeding K(AC) http ...

  5. !!!---1588|Sum of All Odd Length Subarrays(新)

    1588. 所有奇数长度子数组的和 Given an array of positive integers arr(正整数), calculate(计算) the sum of all possibl ...

  6. D28:Maximum sum(最大和,翻译)

    原题:OpenJudge - 1481:Maximum sum 翻译: 描述:给定一组n个整数:A={a1,a2,...,an},我们定义函数d(A)如下: t1 t2 d(A) = max{ ∑ai ...

  7. 英语翻译 Maximum sum

    OpenJudge - 1481:Maximum sum 2022 2.10 Given a set of n integers: A={a1, a2,..., an}, we define a fu ...

  8. SPOJ KGSS Maximum Sum (线段树)

    SPOJ KGSS Maximum Sum 题意:求区间最大值与第二大值之和 思路:线段树维护两个最大值 /********************************************** ...

  9. leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays

    给定数组a[N](每个元素都是正整数)和一个整数k(k小于等于N/3),要求从数组a中找出不相交的三个数组,每个数组长度都为k,使得三个数组之和最大.输出(i,j,k)表示三个子数组的开始下标,如果有 ...

最新文章

  1. 长短期记忆网络_昆明理工大学刘可真、苟家萁、骆钊等:粒子群优化长短期记忆网络模型如何进一步提高变压器油中溶解气体浓度的精准预测?...
  2. Vue 3.0响应式API案例
  3. java学习(139):多个catch块
  4. LeetCode 725. 分隔链表
  5. MySQL数据库的数据类型以及取值范围详解
  6. (MoMoCMS教程10)创建留言板
  7. 1045. 快速排序(25)-PAT乙级真题
  8. 一家世界500强企业为什么还要做不赚钱的生意?
  9. 文件搜索工具(简单版)
  10. 今日头条 推荐机制实现
  11. docker opengrok
  12. 禅修内观 | 一个璀璨的思想成就
  13. # C#程序设计习题_1(西安交通大学)
  14. mybatis-generator工具生成对应的自定Service和Controller
  15. 在Jmeter中添加的JSR223 Sampler后,目前网上资源只有python2.7的jar包,是否有哪位仁兄,有支持python3的jar包,请支持一次。
  16. 机器学习理论基础学习10--- 高斯混合模型GMM
  17. 电机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. 华为云计算之rainbow迁移实验
  19. 美国FDA注册,罐头食品FDA注册
  20. 计算机科学导论的探讨论文,计算机科学导论论文

热门文章

  1. String类的一些常见的获取方法(5)
  2. JS中的预编译(词法分析)阶段和执行阶段
  3. java io之图片存取
  4. [转]Eclipse Java注释模板设置详解
  5. 使用maven引入Apache poi jar包
  6. 59-混沌操作法感悟2.(2015.2.25)
  7. 仔细学习CSS(一)
  8. .Net读取xlsx文件Excel2007
  9. lighttpd,thttpd,shttpd - 轻量级WebServer介绍
  10. 阿里云ESC服务器数据快速转移至轻量应用服务器