Max double slice sum 的解法
1. 上题目:
Task description
A non-empty zero-indexed array A consisting of N integers is given.
A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.
The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1] + A[Y + 1] + A[Y + 2] + ... + A[Z − 1].
For example, array A such that:
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
contains the following example double slices:
- double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,
- double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,
- double slice (3, 4, 5), sum is 0.
The goal is to find the maximal sum of any double slice.
Write a function:
int solution(int A[], int N);
that, given a non-empty zero-indexed array A consisting of N integers, returns the maximal sum of any double slice.
For example, given:
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
the function should return 17, because no double slice of array A has a sum of greater than 17.
Assume that:
- N is an integer within the range [3..100,000];
- each element of array A is an integer within the range [−10,000..10,000].
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
Copyright 2009–2015 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
大体意思很简单,就是求以X为中心的不包含X的左右两段slice的和的最大值。
2.题目分析
这个题目我乍看之下,觉得是一个很动态的问题,有三个变量,一个是中心点X,一个是左边界Y,一个是右边界Z;有了这三个点才能确定出一个确定的double slice。暴力算法的时间复杂度有O(N3). 但是题目要求O(N)。所以肯定存在一种简便算法来完成这个操作,即通过空间来换时间。
我们冷静的分析一下。
首先,这个最大点,肯定是以中间点X为轴左右两段相加和。对于X来说,这个点的max等于左边的max加上右边的max。即我们只要知道,加到X-1处左边能够加到的最大max,和,从右加到X+1处,右边的max,两者相加就为以X点为轴的max。对于其他左sum与右sum来说,必然小于这个max。
那么我们再以O(N)的时间复杂度遍历所有X点,找出最大的即可~
所以现在的问题就变成,找出每一个点X,左侧的连续max slice sum,以及右侧是max slice sum。
这时,我们惊喜的发现,通过递推的算法,我们又可以通过O(N)的时间复杂度完成这个问题~
1.如果我们确定了i点左侧最大sum,那么i+1点最侧最大的sum就是 max((sum[i]+A[i]),0)
2.通过递推,可以用线性时间复杂度完成 foreMax[] 的构建。
3.同理,可以完成postMax[]的构建。
通过这两个数组在每一个节点上的求和,我们便可找到最大的double slice sum的值哦~
时间复杂度为 O(3*N), 空间复杂度为O(2*N);
3.结果:

// you can write to stdout for debugging purposes, e.g.
// printf("this is a debug message\n"); int solution(int A[], int N) {
// write your code in C99
int foreMax[N];
int postMax[N];
A[]=;
A[N-]=; foreMax[]=;
// foreMax[1]=0;
postMax[N-]=;
int i;
for(i=;i<N;i++)
{
if(foreMax[i-]+A[i-]>)
{
foreMax[i]=foreMax[i-]+A[i-];
}
else
{
foreMax[i]=;
}
} for(i=N-;i>=;i--)
{
if((postMax[i+]+A[i+])>)
{
postMax[i]=postMax[i+]+A[i+];
}
else
{
postMax[i]=;
}
}
int max = ; for(i=;i<N-;i++)
{
if(foreMax[i]+postMax[i]>max)
{
max = foreMax[i]+postMax[i];
}
}
return max;
}
Max double slice sum 的解法的更多相关文章
- python 13:数字列表统计方法(min(list)、max(list)、sum(list))
numbers = list(range(1,11)) print(numbers) print(min(numbers)) #获得列表最小值 print(max(numbers)) #获得列表最大值 ...
- elasticsearch 聚合函数 max double精度损失bug
测试样例数据{ "size" : 0, "query" : { "bool" : { "must" : { " ...
- 询问任意区间的min,max,gcd,lcm,sum,xor,or,and
给我们n个数,然后有m个询问,每个询问为L,R,询问区间[L,R]的最大最小值,最小公约数,最大公约数,和,异或,或,且 这些问题通通可以用RMQ的思想来解决. 以下用xor来作为例子 设dp[i][ ...
- Hive函数:SUM,AVG,MIN,MAX
转自:http://lxw1234.com/archives/2015/04/176.htm,Hive分析窗口函数(一) SUM,AVG,MIN,MAX 之前看到大数据田地有关于max()over(p ...
- C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)
今天,我们将着眼于五个用于序列的聚合运算.很多时候当我们在对序列进行操作时,我们想要做基于这些序列执行某种汇总然后,计算结果. Enumerable 静态类的LINQ扩展方法可以做到这一点 .就像之前 ...
- HDU 1003 Max Sum(AC代码)
#include <stdio.h> int main(){ int i,t,j,n,x; int start,end,temp,max,sum; scanf("%d" ...
- HDU--1003 Max Sum(最大连续子序列和)
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- Hive学习之路 (十三)Hive分析窗口函数(一) SUM,AVG,MIN,MAX
数据准备 数据格式 cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, 创建数据库及表 create datab ...
- hdu1024 Max Sum Plus Plus 滚动dp
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- Arduino舵机控制
普通舵机有3根线:GND(黑).VCC(红).Signal(黄) 红色的是电源正极,黑色的是电源负极,白色的是信号线.有些舵机线是红棕橘三色,分别对应红黑白. #include <Servo.h ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- [LeetCode] Find All Duplicates in an Array 找出数组中所有重复项
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...
- [LeetCode] Container With Most Water 装最多水的容器
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- QDialog QMainwindow QWidget QFrame不同时候用法.
继承关系:在Qt中所有的类都有一个共同的基类QObject ,QWidget直接继承与QPaintDevice类,QDialog.QMainWindow.QFrame直接继承QWidget 类. ...
- C# Winform代码片段-大二下学期的垃圾代码
1.图片缩放 using System; using System.Windows.Forms; using System.Drawing; class haha : Form { static vo ...
- Mysql操作语句
MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准SQL数值数据类型. 这 ...
- 如何把Spring制作成jar包,然后在项目里运行。
第一步:首先我们先把Spring的代码准备好.如图一 (图1). 第二步:我们在桌面新建一个文件夹,如图二 (图2). 我们要在这个文件夹里新建两个夹,一个文件夹是你项目的包名,也就是我们图1的aop ...
- git: 修改commiter 信息
Committer: root root@localhost.localdomain 您的姓名和邮件地址基于登录名和主机名进行了自动设置.请检查它们正确 与否.您可以通过下面的命令对其进行明确地设置以 ...
- Hybrid APP混合开发的一些经验和总结
http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...