题目

对于长度为N的数组A,求连续子数组的和最接近0的值。

如:

数组A:1,-2,3,10,-4,7,2,-5

它是所有子数组中,和最接近0的是哪个?

算法流程

申请比A长1的空间sum[-1,0,...,N-1],sum[i]是A的前i项和。定义sum[-1]=0

显然有:A的i到j项和=sum(j)-sum(i-1)

算法思路:

对sum[-1,0,...,N-1]排序,然后计算sum相邻元素的差的绝对值,最小即为所求

在A中任意取两个前缀子数组的和,求差的最小值。

讨论

计算前n项和数组sum和计算sum相邻元素差的时间复杂度,都是O(N),排序的时间复杂度认为是O(N*logN),因此,总时间复杂度:O(NlogN)。

思考:如果需要返回绝对值最小的子数组本身呢?

代码如下

int MinSubarray(const int* a, int size)
{int* sum = new int[size + 1];sum[0] = 0;int i;for (i = 0; i < size; i++){sum[i + 1] = sum[i] + a[i];}sort(sum, sum + size + 1);int difference = abs(sum[1] - sum[0]);int result = difference;for (i = 1; i < size; i++){difference = abs(sum[i + 1] - sum[i]);result = min(difference, result);}delete[] sum;return result;
}

下面来看一下最大连续子数组的问题

给定一个数组A[0,...,n-1],求A的连续子数组,使得该子数组的和最大。

例如:数组1,-2,3,10,-4,7,2,-5最大子数组:3,10,-4,7,2

分析

记S[i]为以A[i]结尾的数组中和最大的子数组,则:S[i+1]=max(S[i]+A[i+1],A[i+1])

S[0]=A[0]

遍历i:0<=i<=n-1

动态规划:最优子问题

时间复杂度O(n)

代码如下

int MaxSubarray(const int* a, int size)
{if (!a || (size <= 0))return 0;int sum = a[0];  // 当前子串的和int result = sum;  // 当前找到的最优解for (int i = 1; i < size; i++){if (sum > 0){sum += a[i];}else{sum = a[i];}result = max(sum, result);}return result;
}

求最大子数组还有一种思路如下:

定义:前缀和sum[i]=a[0]+a[1]+...+a[i]则:a[i,j]=sum[j]-sum[i-1](定义p[-1]=0),最大子数组=sum(j)-sum(i-1)

算法过程

  • 求i前缀sum[i]:

    • 遍历i:0<=i<=n-1
    • sum[i]=sum[i-1]+a[i]
  • 计算以a[j]结尾的子数组的最大值
    • 对于某个j:遍历0<=i<=j,求sum[i]的最小值m
    • sum[j]-m即为a[j]结尾的数组中最大的子数组的值
  • 统计sum[j]-m的最大值,0<=j<=n-1
    • 1,2,3步都是线性的,因此,时间复杂度O(n)。

如果要求子数组本身,只需要记录一下from和to就可以了

算法学习-零子数组,最大连续子数组相关推荐

  1. 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)

    Maximum Subarray 原题链接Maximum Subarray 在给定数组中找到一个子数组(连续),使这个子数组的和最大. O(n2)的解法是求sum[i] - sum[j]的最大值,形如 ...

  2. 算法——和为K的连续子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 链 ...

  3. sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...

    题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...

  4. python求最大连续子数组

    寻找最大子数组问题: 给定数组A:寻找A中的和最大的非空连续子数组.我们称这样的连续子数组为最大子数组(maximum subarray) 1.暴力求解:两个循环,时间复杂度为O(n^2) 2.用分治 ...

  5. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  6. 581. 最短无序连续子数组

    给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...

  7. 数组中最大连续子数组和,最大连续子数组积,最大递增子序列

    最大连续子数组和: 递推式:curmax=max(a[i],curmax)    其中curmax是以i为结尾(意思必须取到a[i])和的最大值,其中每次循环比较curmax和已经保存最大值 最大连续 ...

  8. 查找数组连成环形的和最大的连续子数组

    思路: 把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum.而此时的起点-finalStart和终点-finalEnd也同样可以在求 ...

  9. 【LeetCode】【HOT】581. 最短无序连续子数组

    [LeetCode][HOT]581. 最短无序连续子数组 文章目录 [LeetCode][HOT]581. 最短无序连续子数组 package hot;public class Solution58 ...

最新文章

  1. AI时代的领航者,智能电话机器人对市场的影响
  2. 王飞跃谈GE艰难的数字化转型启示:从工业智联网到工业5.0
  3. linux中 用户管理命令,Linux中的常用用户和用户组管理命令
  4. [gic]-ARM gicv3/gicv2的总结和介绍-PPT
  5. HTML中From表单的常用type属性及用法【较全】
  6. 在SQL SERVER中实现Split功能的函数,并在存储过程中使用
  7. 书生阅读器打开gd文件出错_CAJ论文怎么打开?
  8. flatform installer web 安装php_Windows server 2019 安装 IIS PHP 环境无标题笔记
  9. 【Spark】Spark-空RDD判断与处理
  10. 利用java poi对excel表的读写操作
  11. 解决 前端Failed to decode downloaded font
  12. ActiveSync的使用
  13. 泛泰A850 (高通8064+720p)刷4.4专用中文recovery TWRP2.7.1.3版
  14. 分号(;)和逗号(,)的用法
  15. deepin linux 换回WIN7,deepin ghost win7系统安装方法
  16. android模拟键盘自动输入,Android测试教程5--模拟键盘输入
  17. MT8377 MT8389 MT6589 MT6577解析
  18. 用计算机画函数,用计算机画函数图像 优质课教案设计
  19. 基于SpringBoot下使用分布式文件存储FastDFS
  20. 阿里大数据之路 总述

热门文章

  1. 新浪nbsp;UTnbsp;将于nbsp;6月30日起停止服务
  2. 【虹科案例】Dimetix 激光测距传感器:筒仓内料位高度的测量
  3. 谈谈前端角度出发做好SEO需要考虑什么?
  4. 一个数加100是完全平方数,再加168又是一个完全平方数
  5. 流星雨灯c语言程序,c++流星雨编程步骤祥解
  6. 要在最经典的MACD指标上下功夫
  7. 支付宝iOS版9.2上架:适配iPhone 6s、生活圈、阅后即焚
  8. formData上传Excel文件[object object ]数据库接收不到数据
  9. 几种简单方法找回丢失的IE图标
  10. 玩转百度即用API(5)——空气质量指数查询