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.最大子数组和算法 附上程序运行及测试截图,源码见后 ...
随机推荐
- caioj 1001: [视频]实数运算1[水题]
题意:输入两个实数a和b,输出它们的和 题解:简单题不写题解了-- 代码: #include <cstdio> double a, b; int main() { while (~scan ...
- JavaSE常用类之File类
File类 只用于表示文件或目录的信息,不能对文件内容进行访问. java.io.File类∶代表文件和目录.在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. File类不能访 ...
- Java中的List接口实现类LinkedList
package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ...
- Java中有关clone方法的用法
一.clone在数组基本数据类型中的使用 public class Main { public static void main(String[] args) { int[] arr= {7,8,9} ...
- LC-76
给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t 中重复字符 ...
- Python接入企业微信 - 推送信息到内部群里
前言 之前一篇文章提到了使用wechatpy库来实现企业微信应用登录:Django + Taro 前后端分离项目实现企业微信登录 其实这个库可以实现的功能非常多,基本微信开发涉及到的功能都能实现. 本 ...
- 如何使用 python 爬取酷我在线音乐
前言 写这篇博客的初衷是加深自己对网络请求发送和响应的理解,仅供学习使用,请勿用于非法用途!文明爬虫,从我做起.下面进入正题. 获取歌曲信息列表 在酷我的搜索框中输入关键词 aiko,回车之后可以看到 ...
- Windows原理深入学习系列-强制完整性检查
这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...
- Educational Codeforces Round 116 (Rated for Div. 2), problem: (C) Banknotes
传送门 Problem - C - Codeforces 题目 题目重点内容手打翻译:(欢迎批评指正) 在柏林, 使用着n套不同的货币(banknotes).第i个货币面额为10ai 元,货币的第一种 ...
- golang bufio解析
golang bufio 当进行频繁地对少量数据读写时会占用IO,造成性能问题.golang的bufio库使用缓存来一次性进行大块数据的读写,以此降低IO系统调用,提升性能. 在Transport中可 ...