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.最大子数组和算法 附上程序运行及测试截图,源码见后 ...
随机推荐
- 【uniapp 开发】uni-app 技术点的链接记录
优雅的H5下拉刷新.零依赖,高性能,多主题,易拓展 https://ask.dcloud.net.cn/article/12772 图像(头像)选择,截取,压缩,上传的分享 https://ask.d ...
- 大数据学习之路又之从csv文件到sql文件的操作过程
根据前几天的测试,简单的做个总结 csv文件的字段说明: 1.将csv文件上传到虚拟机中 在SecureCRT中点击,创建目录,直接把文件从本地拖拽进去 我放在了/linmob/data的路径下,所以 ...
- in a frame because it set 'X-Frame-Options' to 'sameorigin'
不是所有网站都给 iframe嵌套的, 有的网站设置了 禁止嵌套!!! 浏览器会依据X-Frame-Options的值来控制iframe框架的页面是否允许加载显示出来, 看你们公司这么设置了!! ...
- HTML2Canvas使用总结
1:指定要生成的DOM元素id 2: 某些图片动态赋值src的url或者base64可能不会被立即渲染:可以设置一个定时器解决 3:可以调用次方法得到的canvas元素转一下格式 png/jpg 4: ...
- enum in c++
enum in c++ enum的实用的定义:给一个值指定一个名称.enums是一种给值命名的方式. 枚举值就是一个整数 用enum的目的:增加程序的可读性 enum的用法:enums [枚举的类名] ...
- CTFHUB之gopher协议实现SSRF
介绍 解题思路: 利用302协议(重定向)的跳转ssrf.可以访问与服务器相连的内网 ①什么是gopher协议 Gopher是Internet上一个信息查找系统,它将Internet上的文件组织成某种 ...
- Servlet实现登录注册
1.注册页面register.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- spring-aop相关概念
如果下面有疑问请看完动态代理技术的分析 Aop术语: Target(目标对象):要被增强的方法的对象 Proxy(代理对象):简单的说就是对目标对象进行增强的代理类 Joinpoint(连接点):可以 ...
- JetBrains Rider C# 学习②
前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5Dul3GLIICRHg 提取码:1314 C#入门课程 刘铁猛 链接:https://pan.ba ...
- Java-NIO之Channel(通道)
1:Channel是什么 通道表示与实体的开放连接,例如硬件设备.文件.网络套接字或能够执行一个或多个不同 I/O 操作(例如读取或写入)的程序组件. 1.1:Channel与Stream的对比 St ...