最大子数组问题 时间复杂度为Θ(n)
《算法导论》中提出的一个解题思路,从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1..j]的最大子数组基于如下性质将解扩展为A[1..j+1]的最大子数组:A[1..j+1]的最大子数组要么是A[1..j]的最大子数组,要么是某个子数组A[i..j+1](1≤i≤j+1)。在已知A[1..j]的最大子数组的情况下,可以在线性时间内找出形如A[i..j+1]的最大子数组。该算法的时间复杂度为因此该算法的时间复杂度为Θ(n)
#include <stdio.h>
#include <string.h>
struct subarray {
int start;
int end;
int sum;
};
#define max(__x, __y) ((__x) > (__y) ? (__x) : (__y))
static void max_sumarray(int *a, int len, void *p)
{
struct subarray *sa = (typeof(sa))p;
int i;
int max_sum, prev, tmp;
int start, end;
if (!sa || (len <= 0)) {
fprintf(stderr, "Invalid argument.\n");
return;
}
memset(sa, 0, sizeof(*sa));
max_sum = a[0];
prev = a[0];
start = end = 0;
for (i = 1; i < len; ++i) {
prev = max(a[i], prev + a[i]); //寻找以当前位置为结尾的最大子串
if (prev < max_sum) {
/**
**如果以当前位置为结尾的最大子串是其本身,则下次扫描时以当前位置为结尾的最大子串的起始位置为本位置
**/
if (prev == a[i]) {
start = i;
}
continue;
}
max_sum = prev;
if (prev == a[i]) {
sa->start = sa->end = i;
} else {
sa->start = start;
sa->end = i;
}
}
sa->sum = max_sum;
}
int main(void)
{
int source[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
struct subarray sa;
max_sumarray(source, sizeof(source) / sizeof(source[0]), &sa);
printf("Max sum: %d, start: %d, end: %d.\n", sa.sum, sa.start, sa.end);
return 0;
}
转载于:https://www.cnblogs.com/yelang5012/archive/2013/04/03/2998358.html
最大子数组问题 时间复杂度为Θ(n)相关推荐
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...
- 求二维数组中最大子数组的和
任国庆 张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组. 求二维数组的最大子数组思想是建立在以为数组.首先将数组的第一列看成一个一维数组,找到该列的最大 ...
- OI基础系列之最大子数组问题
OI基础系列之最大子数组问题 --Edward2414 oi退役了,虽然没取得多少成绩,也算是走过一会的人了.我相信绝大多数oi党都是自学成才,在此,我感谢那些把自己所学写到博客里的前辈们, ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 首尾相连的一位数组最大子数组和
题目:在原有的一位数组上进行扩展,求首尾相连的最大子数组的和: 要求: 输入一个一维整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和 ...
- 求数组的最大子数组和最大子数组的和
输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 1 ...
- 结对开发——环形一维数组求最大子数组和
题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果数组A[0]--A[ ...
- 课堂练习:返回一个二维数组中最大子数组的和
1.题目: 返回一个二维数组中最大子数组的和. 2.要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子 ...
- 动态规划套路:最大子数组和
动态规划套路:最大子数组和 文章目录 动态规划套路:最大子数组和 一.题目描述 二.分析 一.题目描述 这次看一个简答的题: 二.分析 这道题比较简单,主要是回顾动态 规划的解法! 其实第一次看到这道 ...
- 求数组中的最小子数组,时间复杂度o(n),java
石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当 ...
最新文章
- dev c++与VC assist的杂记
- centos把mysql移到数据盘_Centos转移Mysql的数据位置
- 任意文件读取linux,Symphony 1.4.20服务器任意文件读取漏洞
- 现在的男生真的太惨了
- 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
- 日语学习-多邻国-关卡1-餐馆
- 2499元起!红米K20 Pro发布 吊打855友商旗舰?
- C#.NET Form设置/取消开机自动运行,判断程序是否已经设置成开机自动启动(转载)...
- BLE DTM by HCI
- android 自动化测试 百度,Android 自动化测试框架-百度cafe
- 前沿探索:腾讯云数据库自治服务最佳实现
- PowerVR开发工具和SDK 2020 Release 1发布啦!
- Android开发动态的监听网络状态的变化
- 晶闸管整流桥matlab仿真,matlab仿真模型作业
- 程序员的算法趣题Q09: 落单的男女
- 友盟分享error:包名错误,确认与开放平台包名一致
- js中判断空数组和空对象的方法
- 常用液晶12864串行操作
- 全面解读VTL(虚拟磁带库)
- 系统集成项目管理工程师 计算专题(下午计算题-进度类-案例分析)
热门文章
- 解析WINDOWS中的DLL文件---经典DLL解读
- springboot项目自定义注解实现的多数据源切换--亲测有效
- 44. 容器的成员函数优先于同名的算法
- linux 多线程超时中断,c#中的线程超时
- oracle tochar fm,oracle的to_char中的fm-Oracle
- 电脑键盘下划线怎么打_电脑键盘失灵鼠标不动怎么办 键盘失灵鼠标不动解决办法...
- webpack入门+路由配置
- element表格固定某一行_elementui 表格 固定列+合计行
- java两个数组中不同的数字_【Java】 剑指offer(56-1) 数组中只出现一次的两个数字...
- php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码