lintcode--45. 最大子数组差_用最大子数组求解两个正整数间的误差_second24的博客-程序员秘密

技术标签: 子数组  LintCode  

描述

给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。

返回这个最大的差值。

注意事项

子数组最少包含一个数

样例

给出数组[1, 2, -3, 1],返回 6

代码

由于是求两个子数组的和的差的最大绝对值。因此总体有两种情况,一种是左边的子数组的最大和远远大于右边子数组的最小和。另一种是右边子数组的最大和远远大于左边子数组的最小和。因此根据求两个子数组最大和的算法,我们可以推出两个子数组和的差的最大绝对值。

public class Solution {
    /**
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two substrings
     */
    public int maxDiffSubArrays(int[] nums) {
        // write your code here
        int[] left=new int[nums.length];
        int[] right=new int[nums.length];
        int[] minLeft=new int[nums.length];
        int[] maxRight=new int[nums.length];
        int max=nums[0],cur=0;
        for(int i=0;i<nums.length;i++){  //求出从左边开始,到达每个位置的子数组最大和
            cur+=nums[i];
            if(cur>max){
                max=cur;
            }else if(cur<0){
                cur=0;
            }
            left[i]=max;
        }
        int min1=nums[nums.length-1];cur=0;
        for(int i=0;i<nums.length;i++){
   //求出从左边开始,到达每个位置的子数组最小和
            cur+=nums[i];
            if(cur<min1){
                min1=cur;
            }else if(cur>0){
                cur=0;
            }
            minLeft[i]=min1;
        }
        int min=nums[nums.length-1];cur=0;
        for(int i=nums.length-1;i>=0;i--){
            cur+=nums[i];
            if(cur<min){
                min=cur;
            }else if(cur>0){
                cur=0;
            }
            right[i]=min;
        }
        max=nums[nums.length-1];cur=0;
        for(int i=nums.length-1;i>=0;i--){
            cur+=nums[i];
            if(cur>max){
                max=cur;
            }else if(cur<0){
                cur=0;
            }
            maxRight[i]=max;
        }
        int max2=Integer.MIN_VALUE;
        max=Integer.MIN_VALUE;
        for(int i=0;i+1<nums.length;i++){
            if(Math.abs(left[i]-right[i+1])>max){
                max=Math.abs(left[i]-right[i+1]);
            }
            if(Math.abs(minLeft[i]-maxRight[i+1])>max2){
                max2=Math.abs(minLeft[i]-maxRight[i+1]);
            }
        }
        return max>max2?max:max2;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/second24/article/details/79467301

智能推荐

开发踩坑记录_GYB4979的博客-程序员秘密

1.微信小程序安卓端 mescroll 上拉加载后会自动置顶移动端小程序 使用了mescroll列表上拉加载组件,然后用了vant组件库的loading交互, 在IOS端没有任何异常 在大多浏览器没有异常, 唯独小程序在安卓端app运行的时候,上拉加载loading 的时候 会自动将列表置顶了, 不知道具体为什么将vant的Toast.loading({duration:0})去掉就不会冲突影响了...

树莓派折腾记 - 点亮LCD1602_树莓派 lcd1620_外地臭打工的的博客-程序员秘密

上周重新拿出吃灰的树莓派,装了系统,接下来就是写传感器的demo,demo最主要就是找到依赖库,接线和代码并不难。好了,进入正题,本文主要写用树莓派点亮LCD1602,使用nodejs 10。先来一个成品图,和下面接线图有些许差别,加了背光环境准备Raspberry 3b+, ubuntu20.04LCD 16023脚电位器NodeJs 10.19.0具体元器件的说明见Arduino连接LCD1602显示屏,树莓派环境的准备见树莓派基础配置。接线如下图代码const Lcd =

Android序列化(一) 之 Serializable_android serializable_子云心的博客-程序员秘密

1 简介序列化是指将数据对象转换成为一种可存储或可传输的数据格式,而反序列化则是相反的操作,将序列化后的数据还原成对象。最为常见的序列化应用有Json和XML,它们都是行业公认的标准。而在 Java 里,有专门提供了 Serializable 接口用于对象的序列化和反序列化。Serializable接口在java.io包中定义,它本身并不存任何字段和方法,只是用于标识类为可序列化。类对象在序列化后会被转换成为字节输出流OutputStream(BufferedOutputStream、ByteArr

MySQL通过sql语句获取当前日期|时间|时间戳_mysql,date_坦GA的博客-程序员秘密

原文地址:http://blog.csdn.net/llwan/article/details/40345349一、简介1.1 获得当前日期+时间(date + time)函数:now()MySQL> selectnow();+———————+| now() |+———————+| 2013-04-08 20:56:19 |+———————+除了 now()

小程序学习之旅----图片image媒体组件camera、audio、video、live-player、live-pusher_瑞朋哥的博客-程序员秘密

&lt;!--pages/image/image.wxml--&gt;&lt;text&gt;这是一个image组件&lt;/text&gt;&lt;!-- &lt;image src='../../images/0.jpg'&gt;&lt;/image&gt;&lt;image src='/images/0.jpg'&gt;&lt;/image&gt; --&gt; &lt;view...

base64图片存储超过2M的解决方案_base64最大_aliven1的博客-程序员秘密

toDataURL():我们要获取 canvas 中图片的信息,用 toDataURL 就可以转换成上面用到的 DataURL // dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了,所以用img.split获得逗号后面的字符串在javascript中如何使用Base64转码var str = 'javas...

随便推点

RabbitMQ系列教程之六:远程过程调用(RPC)_weixin_34088838的博客-程序员秘密

远程过程调用(Remote Proceddure call【RPC】)(本实例都是使用的Net的客户端,使用C#编写)  在第二个教程中,我们学习了如何使用工作队列在多个工作实例之间分配耗时的任务。  但是,如果我们需要在远程计算机上运行功能并等待结果怎么办? 那是一个不同的故事。 此模式通常称为远程过程调用或RPC。  在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户机和一个可...

C++中cin.get()和cin.getline()的用法以及区别_weixin_44013706的博客-程序员秘密

今天在学习C++的时候对getline()函数和get()函数有点蒙,特地去找了些资料,加上自己上机实验了一些,整理了一些二者的区别。首先二者都是可以从输入流中获得字符,get()函数可以不设置参数,如char ch=cin.get();也可以设置一个参数,这个参数为一个字符变量例如char ch;cin.get(ch);//表示把从输入流中得到的字符赋值给ch变量 。上面这两个用法与c语...

20190131 Ubuntu18.10连接Android蓝牙串口助手_weixin_34368949的博客-程序员秘密

Ubuntu18.10连接Android蓝牙串口助手突然间想这么玩一下,结果发现似乎没有合适的中文资料。环境:PC机系统为Ubuntu18.10(刚刚全新安装的) 安卓手机:蓝牙串口助手(豌豆荚搜索第一个就是了)环境类似也可。想办法让俩设备连接上(配对就完事了),Ubuntu的设置里面就有在本机建立SP(Serial Port)服务命令:#22只要和已有的服务不冲突就行,已有的服务...

1180: [NOIP2013普及组]表达式求值_kunsir_的博客-程序员秘密

1180: [NOIP2013普及组]表达式求值Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 38  Solved: 12[Submit][Status][Web Board]Description给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。Input输入仅有一行,为需要你计算的表

爱若和布若_weixin_33885676的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

多线程之Master-Worker工作模式学习_小博的博客-程序员秘密

Master-Worker设计模式介绍Master-Worker模式是常用的并行设计模式。核心思想是,系统由两个角色组成,Master和Worker,Master负责接收和分配任务,Worker负责处理子任务。任务处理过程中,Master还负责监督任务进展和Worker的健康状态;Master将接收Client提交的任务,并将任务的进展汇总反馈给Client。各角色关系如下图Master...