v 题目:连续子数组求和 II

给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的值。如果多个答案,请返回其中任意一个。

v 样例

给定 [3, 1, -100, -3, 4], 返回 [4,0].

v 思路

1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间。从左边开始一直累加,并初始当前区间[ld, rd]的左右两端的值。如果在累加之前发现sum<0,那么更新sum为当前的要累加的数字,并且重置新的区间左右两端的值(即[ld, rd]的值)。另外在累加的过程中,如果sum的值大于maxN,更新maxN的值,并且更新最大值区间(即[lt, rt]改变成[ld, rd])。

2.现在是循环数组,最大和的区间可能会出现在数组的两端,也就是数组的左边一段和数组的右边的一段组成。那么中间的那一部分就是区间和最小的部分。假设一下左端区间[l1, r1]和右端区间[l2, r2]组成最大和的区间,如果[r1+1, l2-1]不是最小和区间,那么存在区间[lx, rx]的和比[r1+1, l2-1]区间和更小(其中有lx>r1+1, rx<l2-1),那么也就是区间[r1+1, lx-1](或者[rx+1, l2-1])和一定大于0,这样必然会导致左端区间[l1, r1]区间和 + 区间[r1+1, lx-1]和更大。所以区间[r1+1, l2-1]一定是最小区间和。

如 [-1, 2, -1, 2, -1, 10, -100, 10, 9, 8, 7], 这个例子中,最小的区间和是-100,区间[6, 6], 区间[7, 5](注意是循环数组)就是最大的区间和。

v AC代码
class Solution {
public:
/**
* @param A an integer array
* @return A list of integers includes the index of
* the first number and the index of the last number
*/
vector<int> continuousSubarraySumII(vector<int>& A) {
// Write your code here
int ld=, rd=, lt=, rt=;
int sum = , maxN = -0x3f3f3f3f;
for(int i=; i<A.size(); ++i){
if(sum < ){
sum = A[i];
if(maxN < sum){
maxN = sum;
lt = rt = i;
}
ld = rd = i;
} else {
sum += A[i];
rd = i;
if(maxN < sum){
maxN = sum;
lt = ld;
rt = rd;
}
}
} ld = rd = ;
int lx=, rx=;
int sumx = , minN = 0x3f3f3f3f, summ = ;
for(int i=; i<A.size(); ++i){
summ += A[i];
if(sumx > ){
sumx = A[i];
if(minN > sumx){
minN = sumx;
lx = rx = i;
}
ld = rd = i;
} else {
sumx += A[i];
rd = i;
if(minN > sumx){
minN = sumx;
lx = ld;
rx = rd;
}
}
}
vector<int> ans;
if(summ-minN > maxN && lx> && rx+<A.size()){//两端组成的区间和最大,并且所有的数不都是负数的情况
ans.push_back(rx+);
ans.push_back(lx-);
} else {
ans.push_back(lt);
ans.push_back(rt);
}
return ans;
}
};

lintcode循环数组之连续子数组求和的更多相关文章

  1. Task 4 求数组的连续子数组的最大和(团队合作)

    小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...

  2. 个人实战演练全过程——No.1 最大连续子数组求和

    之前的一次个人总结和一次单元测试入门学习是开启软件工程课程的前奏曲,也是热身,现在大家对于这门课程也有了初步的了解和认识,这次要开始真正的演奏了,要从头到尾完全靠自己的能力来解决一个问题,进行实战演练 ...

  3. [LintCode] Continuous Subarray Sum 连续子数组之和

    Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...

  4. Java实验——输出一个数组里面连续子数组最大的和(二)文件操作

    在本周的练习中,主要是对上周的实验进行健壮性的完善,即在所能考虑到的情况之中,尽量使自己的程序能够正常地运行. 在上周的实验中,我已经是在编程过程中考虑到用户输入的错误类型的问题,所以这一方面并没有多 ...

  5. Dp解决数组中连续子数组的最大和

    #include<iostream> ];     ;i<size;i++)     {           TempSum = CurSum;           )        ...

  6. lintcode :continuous subarray sum 连续子数组之和

    题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...

  7. 最大连续子数组问题2-homework-02

    1) 一维数组最大连续子数组 如第homework-01就是一维数组的最大子数组,而当其首位相接时,只需多考虑子数组穿过相接的那个数就行了! 2)二维数组 算法应该和第一次的相似,或者说是将二维转化为 ...

  8. 找一个数组的最大和的连续子数组(时间复杂度 O(n))(二)

    要求: 要求数组从文件读取. 如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出. 另外, 如果输入文件的参数有错误, 这个程序应该 ...

  9. 找一个数组的最大和的连续子数组(时间复杂度 O(n))

    设计思想 一开始的思想是求出全部的情况,再分别比较大小,这种方法适用于有限个数组,不适用于输入数组长度和内容的情况. 但也试着做了 int a[]= {-1,2,6,-10}; int size=4; ...

随机推荐

  1. matlab 求解线性方程组之范数

    1.赋范线性空间和内积空间 在线性代数的初级教材里,一般是在向量空间中定义内积,然后再由内积来导出范数,比如在n维实向量空间中: |x||=√<x,x> 在线性代数的高级教材中,一般是将内 ...

  2. Node.js抓取网页

    前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web 总结一下用到的知识,简单的网页抓取大概就是这个流程了 发送Get或Post请求 表单提交,首先弄到原网页提交 ...

  3. myBatis中 collection 或 association 联合查询 中column 传入多个参数值

    下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap"  type="com.maidan.daas.entit ...

  4. Unity自动寻路入门指南

    所有用于成为NavMesh的网格都必须被指定为 Navigation Static . 方法如下,选中GameObject,然后在菜单栏的[Window]-[Navigation]-[Object]- ...

  5. java反射机制,通过类名获取对象,通过方法名和参数调

    import java.lang.reflect.Method;   import javax.persistence.Table; /**  * 通过注解javax.persistence.Tabl ...

  6. 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference AtomicReference无法解决上述问题的根 ...

  7. SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题

    SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题 最近服务器执行收缩日志文件大小的job老是报错 我所用的一个批量收缩日志脚本 USE [master] GO /*** ...

  8. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...

  9. [译]MVC网站教程(一):多语言网站框架

    本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...

  10. .Net中的反应式编程(Reactive Programming)

    系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...