《算法导论》中提出的一个解题思路,从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知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)相关推荐

  1. 求一个二维整数数组最大子数组之和,时间复杂度为N^2

    本随笔只由于时间原因,我就只写写思想了   二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...

  2. 求二维数组中最大子数组的和

    任国庆  张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组. 求二维数组的最大子数组思想是建立在以为数组.首先将数组的第一列看成一个一维数组,找到该列的最大 ...

  3. OI基础系列之最大子数组问题

    OI基础系列之最大子数组问题   --Edward2414    oi退役了,虽然没取得多少成绩,也算是走过一会的人了.我相信绝大多数oi党都是自学成才,在此,我感谢那些把自己所学写到博客里的前辈们, ...

  4. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  5. 首尾相连的一位数组最大子数组和

    题目:在原有的一位数组上进行扩展,求首尾相连的最大子数组的和: 要求: 输入一个一维整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和 ...

  6. 求数组的最大子数组和最大子数组的和

    输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 1 ...

  7. 结对开发——环形一维数组求最大子数组和

    题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果数组A[0]--A[ ...

  8. 课堂练习:返回一个二维数组中最大子数组的和

    1.题目: 返回一个二维数组中最大子数组的和. 2.要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子 ...

  9. 动态规划套路:最大子数组和

    动态规划套路:最大子数组和 文章目录 动态规划套路:最大子数组和 一.题目描述 二.分析 一.题目描述 这次看一个简答的题: 二.分析 这道题比较简单,主要是回顾动态 规划的解法! 其实第一次看到这道 ...

  10. 求数组中的最小子数组,时间复杂度o(n),java

    石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当 ...

最新文章

  1. dev c++与VC assist的杂记
  2. centos把mysql移到数据盘_Centos转移Mysql的数据位置
  3. 任意文件读取linux,Symphony 1.4.20服务器任意文件读取漏洞
  4. 现在的男生真的太惨了
  5. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  6. 日语学习-多邻国-关卡1-餐馆
  7. 2499元起!红米K20 Pro发布 吊打855友商旗舰?
  8. C#.NET Form设置/取消开机自动运行,判断程序是否已经设置成开机自动启动(转载)...
  9. BLE DTM by HCI
  10. android 自动化测试 百度,Android 自动化测试框架-百度cafe
  11. 前沿探索:腾讯云数据库自治服务最佳实现
  12. PowerVR开发工具和SDK 2020 Release 1发布啦!
  13. Android开发动态的监听网络状态的变化
  14. 晶闸管整流桥matlab仿真,matlab仿真模型作业
  15. 程序员的算法趣题Q09: 落单的男女
  16. 友盟分享error:包名错误,确认与开放平台包名一致
  17. js中判断空数组和空对象的方法
  18. 常用液晶12864串行操作
  19. 全面解读VTL(虚拟磁带库)
  20. 系统集成项目管理工程师 计算专题(下午计算题-进度类-案例分析)

热门文章

  1. 解析WINDOWS中的DLL文件---经典DLL解读
  2. springboot项目自定义注解实现的多数据源切换--亲测有效
  3. 44. 容器的成员函数优先于同名的算法
  4. linux 多线程超时中断,c#中的线程超时
  5. oracle tochar fm,oracle的to_char中的fm-Oracle
  6. 电脑键盘下划线怎么打_电脑键盘失灵鼠标不动怎么办 键盘失灵鼠标不动解决办法...
  7. webpack入门+路由配置
  8. element表格固定某一行_elementui 表格 固定列+合计行
  9. java两个数组中不同的数字_【Java】 剑指offer(56-1) 数组中只出现一次的两个数字...
  10. php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码