C++:最大子数组差
最大子数组差
内存限制: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++:最大子数组差的更多相关文章
- lintcode:最大子数组差
题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1], ...
- lintcode-45-最大子数组差
45-最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 注意事项 子数组最少包含一个数 样例 给出 ...
- LintCode-最大子数组差
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 您在真实的面试中是否遇到过这个题? Yes 例子 给出数组[1 ...
- CLRS最大子数组问题
今天我们一起来看一下关于最大子数组的一些问题.最大子数组的应用场景可以是这样的:有一天,你搞了一场投资开始炒股,这时你就会想,我怎样才能获得最大的利润呢,最简单的想法就是我在股票的最低价时买入,然后在 ...
- [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 ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法
1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...
随机推荐
- TensorFlow使用GPU训练时CPU占用率100%而GPU占用率很低
在训练keras时,发现不使用GPU进行计算,而是采用CPU进行计算,导致计算速度很慢. 用如下代码可检测tensorflow的能使用设备情况: from tensorflow.python.clie ...
- MapReduce在集群执行任务时报错:Initialization of all the collectors failed. Error in last collector was:java.lang.ClassCastException
报错信息详细: Error: java.io.IOException: Initialization of all the collectors failed. Error in last colle ...
- 每天找回一点点之MD5加密算法
之前在做项目的时候用户密码都进行了MD5的加密,今天突然想起来了总结一下(●'◡'●) 一.MD5是什么? MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被 ...
- HTML2Canvas使用总结
1:指定要生成的DOM元素id 2: 某些图片动态赋值src的url或者base64可能不会被立即渲染:可以设置一个定时器解决 3:可以调用次方法得到的canvas元素转一下格式 png/jpg 4: ...
- Springcloud报错:java.lang.IllegalStateException: Service id not legal hostname (/a-service)
今天在做springcloud链路追踪的时候,报错java.lang.IllegalStateException: Service id not legal hostname (/a-service) ...
- Struct2中三种获取表单数据的方式
1.使用ActionContext类 //1获取ActionContext对象 ActionContext context = ActionContext.getContext(); //2.调用方法 ...
- 帝国CMS批量提取正文内容到简介
最近接到一个帝国CMS模板改版项目,自带的数据可能是采集的,以前的简介字段内容只截取了60个字,新模板的简介60字符太少了,不美观,想让简介都截取200个字,怎么批量修改呢,文章太多了手动改肯定不行, ...
- Python Windows 快捷键自动给剪贴板(复制)图片添加水印
编写一个能在windows上使用的按下快捷键自动给剪贴板(复制)的图片添加水印的小工具.plyer.PIL.pyinstaller.pynput.win32clipboard库.记录自己踩过的坑,部分 ...
- SpringBoot 入门及配置
1.首先创建Maven文件,右键单击鼠标,others搜索Maven,点击Maven Project 2.点击下一步,打上勾下一步,输入包名和项目名称 3.第三步修改pom.xml导入Maven依赖M ...
- perf性能分析工具使用分享
@ 目录 前言 perf的介绍和安装 perf基本使用 perf list使用,可以列出所有的采样事件 perf stat 概览程序的运行情况 perf top实时显示当前系统的性能统计信息 perf ...