算法学习-零子数组,最大连续子数组
题目
对于长度为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就可以了
算法学习-零子数组,最大连续子数组相关推荐
- 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
Maximum Subarray 原题链接Maximum Subarray 在给定数组中找到一个子数组(连续),使这个子数组的和最大. O(n2)的解法是求sum[i] - sum[j]的最大值,形如 ...
- 算法——和为K的连续子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 链 ...
- sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...
题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...
- python求最大连续子数组
寻找最大子数组问题: 给定数组A:寻找A中的和最大的非空连续子数组.我们称这样的连续子数组为最大子数组(maximum subarray) 1.暴力求解:两个循环,时间复杂度为O(n^2) 2.用分治 ...
- LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...
- 581. 最短无序连续子数组
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...
- 数组中最大连续子数组和,最大连续子数组积,最大递增子序列
最大连续子数组和: 递推式:curmax=max(a[i],curmax) 其中curmax是以i为结尾(意思必须取到a[i])和的最大值,其中每次循环比较curmax和已经保存最大值 最大连续 ...
- 查找数组连成环形的和最大的连续子数组
思路: 把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum.而此时的起点-finalStart和终点-finalEnd也同样可以在求 ...
- 【LeetCode】【HOT】581. 最短无序连续子数组
[LeetCode][HOT]581. 最短无序连续子数组 文章目录 [LeetCode][HOT]581. 最短无序连续子数组 package hot;public class Solution58 ...
最新文章
- AI时代的领航者,智能电话机器人对市场的影响
- 王飞跃谈GE艰难的数字化转型启示:从工业智联网到工业5.0
- linux中 用户管理命令,Linux中的常用用户和用户组管理命令
- [gic]-ARM gicv3/gicv2的总结和介绍-PPT
- HTML中From表单的常用type属性及用法【较全】
- 在SQL SERVER中实现Split功能的函数,并在存储过程中使用
- 书生阅读器打开gd文件出错_CAJ论文怎么打开?
- flatform installer web 安装php_Windows server 2019 安装 IIS PHP 环境无标题笔记
- 【Spark】Spark-空RDD判断与处理
- 利用java poi对excel表的读写操作
- 解决 前端Failed to decode downloaded font
- ActiveSync的使用
- 泛泰A850 (高通8064+720p)刷4.4专用中文recovery TWRP2.7.1.3版
- 分号(;)和逗号(,)的用法
- deepin linux 换回WIN7,deepin ghost win7系统安装方法
- android模拟键盘自动输入,Android测试教程5--模拟键盘输入
- MT8377 MT8389 MT6589 MT6577解析
- 用计算机画函数,用计算机画函数图像 优质课教案设计
- 基于SpringBoot下使用分布式文件存储FastDFS
- 阿里大数据之路 总述
热门文章
- 新浪nbsp;UTnbsp;将于nbsp;6月30日起停止服务
- 【虹科案例】Dimetix 激光测距传感器:筒仓内料位高度的测量
- 谈谈前端角度出发做好SEO需要考虑什么?
- 一个数加100是完全平方数,再加168又是一个完全平方数
- 流星雨灯c语言程序,c++流星雨编程步骤祥解
- 要在最经典的MACD指标上下功夫
- 支付宝iOS版9.2上架:适配iPhone 6s、生活圈、阅后即焚
- formData上传Excel文件[object object ]数据库接收不到数据
- 几种简单方法找回丢失的IE图标
- 玩转百度即用API(5)——空气质量指数查询