zoukankan      html  css  js  c++  java
  • 动态规划——Maximum Sum of 3 Non-Overlapping Subarrays

    这个题对我来说真的是相当难的题目了,严格来讲可能不算是个动态规划的题目,但这个题目对类似的划分多个非重叠连续子区间的问题提供了一个很好解决方案

    这个题目需要找三个非重叠的连续子区间,通过维护两个数组将第一个和第三个子区间可能的开始pos记录下来,在中间那个子区间开始的pos遍历时限制其边界范围,根据长度能恰到好处的将三个子区间划分成非重叠的,还使用了集合相减代替累加这样比较简单好用的技巧

    下面提供代码:

     1 class Solution {
     2     public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
     3         int len = nums.length;
     4         int[]sum = new int[len+1];
     5         for(int i = 0;i<len;i++)
     6             sum[i+1] = sum[i]+nums[i];
     7         int[]posLeft = new int[len];
     8         int[]posRight = new int[len];
     9         posLeft[k-1] = 0;
    10         int total = sum[k]-sum[0];
    11         for(int i = k;i<len;i++) {
    12             if(total<sum[i+1]-sum[i+1-k]) {
    13                 total = sum[i+1]-sum[i+1-k];
    14                 posLeft[i] = i-k+1;
    15             }else posLeft[i] = posLeft[i-1];
    16         }
    17         posRight[len-k] = len-k;
    18         total = sum[len]-sum[len-k];
    19         for(int i = len-k-1;i>=0;i--) {
    20             if(total<sum[i+k]-sum[i]) {
    21                 total = sum[i+k]-sum[i];
    22                 posRight[i]= i;
    23             }else posRight[i] = posRight[i+1];
    24         }
    25         int l = 0,r = 0,max = 0;
    26         int[]arr = new int[3];
    27         for(int i = k;i<=len-2*k;i++) {
    28             l = posLeft[i-1];
    29             r = posRight[i+k];
    30             total = (sum[l+k]-sum[l])+(sum[i+k]-sum[i])+(sum[r+k]-sum[r]);
    31             if(total>max) {
    32                 arr[0] = l;arr[1] = i;arr[2] = r;
    33                 max = total;
    34             }
    35         }
    36         return arr;
    37     }
    38 }
  • 相关阅读:
    es5
    总有你用的上插件
    三级联动
    jquery快速入门
    动态创建数据table
    背景裁切
    移动web-bootstrap
    ionic开发之Android可以很快打开主页,iOS要几分钟打开主页
    .Net语言 APP开发平台——Smobiler学习日志:如何在手机上快速实现CandleStickChart控件
    .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能
  • 原文地址:https://www.cnblogs.com/messi2017/p/10055784.html
Copyright © 2011-2022 走看看