zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 689 三个无重叠子数组的最大和(换方向筛选)

    689. 三个无重叠子数组的最大和

    给定数组 nums 由正整数组成,找到三个互不重叠的子数组的最大和。

    每个子数组的长度为k,我们要使这3*k个项的和最大化。

    返回每个区间起始索引的列表(索引从 0 开始)。如果有多个结果,返回字典序最小的一个。

    示例:

    输入: [1,2,1,2,6,7,5,1], 2
    输出: [0, 3, 5]
    解释: 子数组 [1, 2], [2, 6], [7, 5] 对应的起始索引为 [0, 3, 5]。
    我们也可以取 [2, 1], 但是结果 [1, 3, 5] 在字典序上更大。
    注意:

    nums.length的范围在[1, 20000]之间。
    nums[i]的范围在[1, 65535]之间。
    k的范围在[1, floor(nums.length / 3)]之间。

    class Solution {
       private int maxSum;
    
        public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
           
    
            int n = nums.length;
    
            int[] sum = new int[n+1], left = new int[n], right = new int[n];
    
            for(int i=0; i<n; i++){
                sum[i+1] = sum[i]+nums[i];
            }
            //从左面筛选
            for(int i=k, leftmax = sum[k]-sum[0]; i<n ;i++){
                if(sum[i+1]-sum[i+1-k] > leftmax){
                    leftmax = sum[i+1] - sum[i+1-k];
                    left[i] = i+1-k;
                }else{
                    left[i] = left[i-1];
                }
            }
            //右面筛选
            right[n-k] = n-k;
            for(int i=n-k-1, rightMax = sum[n]-sum[n-k]; i>=0; i--){
                if(sum[i+k]-sum[i]>= rightMax){
                    right[i] = i;
                    rightMax = sum[i+k] - sum[i];
                }else{
                    right[i] = right[i+1];
                }
            }
            //去中间找,然后记录总和
            int maxsum = 0; int[] result = new int[3];
            for(int i=k; i<=n-2*k; i++){
                int l = left[i-1], r = right[i+k];
                int total = (sum[i+k]-sum[i]) + (sum[l+k] - sum[l]) + (sum[r+k]-sum[r]);
                if(total>maxsum){
                    maxsum = total;
                    result[0] = l; result[1] = i; result[2] =r;
                }
            }
    
            return result;
    
           
        } 
    }
    
  • 相关阅读:
    2018.5.22 Oracle安装配置在虚拟机中外部电脑连接服务
    2018.5.20 oracle强化练习
    2018.5.19 Oracle数据操作和管理表的综合练习
    2018.5.18 AndroidStudio创建项目出错
    2018.5.17 oracle函数查询
    2018.5.14 XML文档类型定义----DTD
    2018.5.13 oracle遇到的问题
    二元搜索算法(分治法)
    循环队列(弥补队列顺序储存的不足)
    队列的顺序储存
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074797.html
Copyright © 2011-2022 走看看