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 hereint ld=0, rd=0, lt=0, rt=0;int sum = 0, maxN = -0x3f3f3f3f;for(int i=0; i<A.size(); ++i){if(sum < 0){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 = 0;int lx=0, rx=0;int sumx = 0, minN = 0x3f3f3f3f, summ = 0;for(int i=0; i<A.size(); ++i){summ += A[i];if(sumx > 0){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>0 && rx+1<A.size()){//两端组成的区间和最大,并且所有的数不都是负数的情况ans.push_back(rx+1);ans.push_back(lx-1);} else {ans.push_back(lt);ans.push_back(rt);}return ans;}
};

转载于:https://www.cnblogs.com/hujunzheng/p/5027248.html

lintcode循环数组之连续子数组求和相关推荐

  1. 数组的连续子数组最大和(首尾相连)

    题目: 求一个循环数组的连续子数组的最大和. 解法: <编程之美>上给出一种方法: 1)求[0, n-1]的最大和: 2)如果跨过了n-1,则计算以n-1为尾部的最大子数组[i, n-1] ...

  2. 结对开发项目:求整数数组中连续子数组和的最大值

    小组成员:安娜 王鑫楠 题目二:求整数数组中连续子数组和的最大值. 1.分析过程: 题目收到后,前五分钟设计算法,首先也想到是不是一次遍历可以解决,考虑了一下觉得难度有点大最后还是果断放弃.我刚开始的 ...

  3. 关于求已知整数数组的连续子数组的最大和的方法 ——基于一维数组的循环,甚至推广到二维情况上...

    日期:2019.3.21 博客期:049 星期四 先二话不说,先交代码,今天训练的内容是"这个整数数组是允许开头和结尾结合在一起的",大家的思路都是扩大数组内容,就是将读入的数据存 ...

  4. 返回一个数组的连续子数组和的最大值

    package wodeshiyao;import java.util.Scanner;public class lalala {static Scanner scan=new Scanner(Sys ...

  5. 线性dp:DP9 环形数组的连续子数组最大和

    描述 给定一个长度为 n 的环形整数数组,请你求出该数组的 非空连续子数组 的最大可能和 . 环形数组 意味着数组的末端将会与开头相连呈环状.例如,对于数组 [1,3,-5,2,-4]而言,第一个数  ...

  6. 算法学习-连续子数组求和最大值

    1.最笨的办法-穷举法 思路就是,取出所有可能的子数组,即找出所有可能的0≤i≤j≤n,然后求出数组从i到j的所有数的和再对比,这样的方法时间复杂度较高,python实现如下: class Solut ...

  7. 最大连续子数组和与JUnit测试

    [题目]最大连续子数组和(最大子段和) 背景 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当 ...

  8. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  9. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

最新文章

  1. edgesForExtendedLayout
  2. 事件冒泡和捕获的执行顺序
  3. 【OpenCV】图像几何变换:旋转,缩放,斜切
  4. 为什么说要注销 QQ 的,都是君子呢?
  5. easyui---layout实战
  6. Hello can not find git path
  7. Postgresql的基本操作
  8. 渗透测试报告模板_网站安全测试报告模板该如何写
  9. Package zip is not available, but is referred to by another package.
  10. 计算机网络 谢希仁版 部分知识点(未写完,更新中)
  11. (译)2019年前端性能优化清单 — 中篇
  12. SQLMAP的常用参数
  13. 无线通信中比bit更小的“”数据单位”码片(也叫码元 ,chip) 什么是符号速率
  14. CString 使用详解
  15. JVM 垃圾回收器 ZGC
  16. PHPStorm 502 / 404
  17. 非严格次小生成树 pqq的礼物
  18. JavaScript三目判读男女
  19. Skill: win10: 开机启动项管理配置
  20. day01_Java语言概述

热门文章

  1. finalize方法_final,finally,finalize三者的含义和区别
  2. Linux 便笺技巧专栏
  3. mybatis-plus的 mapper.xml 路径配置的坑
  4. cnpm不是内部或外部命令 cnpm: command not found 解决方案 cnpm
  5. 企业实战01_Linux下安装ActiveMQ并设置开机启动
  6. linux显示mem进行排序,Linux查看系统负载(CPU和MEM考虑)
  7. qtcreator下拉列表怎么制作_设置EXCEL动态下拉菜单,只需要一个组合键,新手也能快速掌握...
  8. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验
  9. java国家电网面试试题_国家电网笔试面试相关
  10. 计算机的3类系统总线分别是_《深入理解计算机系统》读书笔记—第六章、存储器层次结构...