最大子数组差

内存限制:128 MiB        时间限制:1000 ms

题目描述:

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

输出这个最大的差值。

输入:

共两行。

第一行:一个整数n,表示整数数组的长度。

第二行:n个整数。(每个数的绝对值不大于1e4)

输出:

最大的差值。

样例输入:

样例1输入:

4

1 2 -3 1

样例1输出:

6

样例2输入:

7
2
-1 -2 1 -4 2 8

样例2输出:

16

数据范围与提示:

n <= 1e5

在领扣(Lintcode)海题时候海到的,有点动态规划的意思。

人话点说,就是找到一串最大的连续子数组与另一串不重叠的最小子数组,然后把它们相减,取绝对值。感觉我在废话

什么是子数组呢?

比如:数组a为        2, 3,13, 5,235, 3251, 33, 25;

3, 13, 5, 235就是数组a的子数组;

拿出你的小脑袋瓜思考一下,最大子数组与最小子数组的分布会不会有以下情况:

想好了吗?

答案是:不会

如果中间那段是正数的话,应该和最大子数组一起,对吧

如果是负数的话,就应该放到最小子数组:

如果是零,放哪边都无所谓

综上,我们可以得出:最大子数组和最小子数组是相邻的

如何使|SUM(A)-SUM(B)|尽可能大,我们要做讨论

当A是大数时,如①

当B是大数时,如②

A从终点往左找最大值/最小值,B从起点往右找最小值/最大值

我好像什么都没说,又好像什么都说了,终于分析完了,要码到头晕了

完整代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n, a[100010], amax[MAXN], amin[MAXN], bmax[MAXN], bmin[MAXN], intmin=-214748367;
int main() {
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d", &a[i]);
amax[i]=max(a[i], amax[i-1]+a[i]);//求SUM(A)最大值
amin[i]=min(a[i], amin[i-1]+a[i]);//求SUM(A)最小值
}
for(int i=n;i>=1;i--){
bmax[i]=max(a[i], bmax[i+1]+a[i]);//求SUM(B)最大值
bmin[i]=min(a[i], bmin[i+1]+a[i]);//求SUM(B)最大值
}
for(int i=1;i<=n-1;i++){
if(abs(amax[i]-bmin[i+1])>maxn)maxn=amax[i]-bmin[i+1];//当SUM(A)是大数时
}
for(int i=n;i>=2;i--){
if(abs(bmax[i]-amin[i-1])>maxn)maxn=bmax[i]-amin[i-1];//当SUM(B)是大数时
}
printf("%d", maxn);
return 0;
}

老规矩,抵制学术不端行为,拒绝Ctrl+c

呵,又是苟延残喘的一天~

C++:最大子数组差的更多相关文章

  1. lintcode:最大子数组差

    题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1], ...

  2. lintcode-45-最大子数组差

    45-最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 注意事项 子数组最少包含一个数 样例 给出 ...

  3. LintCode-最大子数组差

    给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 您在真实的面试中是否遇到过这个题? Yes 例子 给出数组[1 ...

  4. CLRS最大子数组问题

    今天我们一起来看一下关于最大子数组的一些问题.最大子数组的应用场景可以是这样的:有一天,你搞了一场投资开始炒股,这时你就会想,我怎样才能获得最大的利润呢,最简单的想法就是我在股票的最低价时买入,然后在 ...

  5. [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  6. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  9. 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法

    1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...

随机推荐

  1. 更改spinner字体大小

    做下拉框的时候,我采用的是spinner和string-array,因为比较简单. 可是整个界面的字体大小与下拉框里面的字体大小不符合,所以我们要更改spinner里面的字体大小. 方法是: 在布局中 ...

  2. java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.javaimport java.io.FileInputStream; import java.io.FileWriter; i ...

  3. docker下将容器按照端口号分配

    问题情境:现在有一个服务器主机,安装了docker,想给成员分配各自的容器,但不想成员通过宿主机进入容器.那么成员如何直接访问容器呢? 成员可以通过ip加端口号访问 因此,需要生成一个容器,将容器的2 ...

  4. win2008升级mysql5.7.20步骤总结

    环境: 系统:红帽5.5 旧版mysql:5.5 新版mysql:5.7.20 前期准备: 1.备份旧版mysql数据,不知道data目录在哪可以在my.ini配置文件里面查看datadir指定的目录 ...

  5. FSB—QPI—DMI总线的发展

    intel CPU有的是前端总线(FSB),有的是QPI总线,有的又是DMI总线 FSB总线(由于cpu的发展,fsb总线制约了cpu的发展,所以该总线已经渐渐淡出历史舞台) FSB即Front Si ...

  6. 【面试普通人VS高手系列】谈谈你对Seata的理解

    很多面试官都喜欢问一些"谈谈你对xxx技术的理解". 大家遇到这种问题时,是不是完全不知道从何说起. 那么我们来看一下,普通人和高手是如何回答这个问题的? 普通人: Seata是用 ...

  7. C# 静态常量(const)动态常量(static、readonly)用法区别

    C# 常量的命名方法 一个低级错误 readonly.const 代码 使用方式 支持类型 维护性 性能比较 优先使用 C# Static 与 Java Static C# Const 与 Java ...

  8. Hystrix熔断初体验

    <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring ...

  9. Java学习day2

    今天学习了Java的数据类型.运算符.选择循环结构以及数组. Java所有的关键字全部小写 Java的数据类型与c语言相似,但是c语言定义数组时可以不主动对其初始化,而Java则必须先初始化,有动态和 ...

  10. 基于 Redis 分布式锁

    1.主流分布式锁实现方案 基于数据库实现分布式锁 基于缓存(redis 等) 基于 Zookeeper 2.根据实现方式分类 : 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线 ...