C数组中最大和的子数组

题目:

输入一个整型数组,数据元素有正数也有负数,求元素组合成 连续子数组之和最大的子数组,要求时间复杂度为O(n)。

例如:

输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大和的连续子数组为3, 10, -4, 7, 2,其最大和为18。

背景:

本题最初为2005年浙江大学计算机 系考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都 把本题当作面试题。

由于本题在网络中广为流传,本题也顺利成为2006年 程序员面试题中经典中的经典。

分析:

如果不考虑时间复杂度, 我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的 数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2);而且求一个长度为 n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。

很容易 理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。 如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零 ,不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下 代码。

void MaxSum(int array[], unsigned int len)
{
    if(NULL == array || len <=0){
        return;
    }     

    int curSum = 0, maxSum = 0;
    int i = 0;
    for(i=0; i<len; i++){
        curSum += array[i];     // 累加     

        if(curSum < 0){          // 当前和小于0,重置为0
            curSum = 0;
        }     

        if(curSum > maxSum){ // 当前和大于最大和,则重置最大和
            maxSum = curSum;
        }
    }     

    if(maxSum == 0){            // 最大和依然为0,说明数组中所有元素都

为负值
        maxSum = array[0];
        for(i=1; i<len; i++){
            if(array[i] > maxSum){
                maxSum = array[i];
            }
        }
    }     

    printf("maxSum: %d", maxSum);
}

测试数组:

int array[] = {1, -2, 3, 10, -4, 7, 2, -

5};     // 3, 10, -4, 7, 2 = 18

运行结果:
 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, c语言程序题
, 时间复杂度
, 面试题
, 复杂度
, 时间
, 负数
, 子集和的小问题
, 一个
, 求数组长度
子数组
c 数组最大值、c 数组最大长度、c语言数组最大长度、c语言求数组最大值、c语言找出数组最大值,以便于您获取更多的相关知识。

时间: 2024-10-01 07:27:09

C数组中最大和的子数组的相关文章

android-转换数组中的JSON字符串为数组

问题描述 转换数组中的JSON字符串为数组 下面的字符串是作为json对象获取的: [ { "id": "picture1", "caption": "sample caption", "picname": "sample picture name" } ] 然后将它转换到数组中,这样可以填充到列表中. JSONArray myjsonarray = myjson.toJSONArray

java-Java中获取多个鼠标动作并保存到point2d数组中,并使用此数组

问题描述 Java中获取多个鼠标动作并保存到point2d数组中,并使用此数组 Java中获取多个鼠标动作并保存到point2d数组中,并使用此数组建立另一个line2d数组,并画出此线段,我在建立line2d的时候老是提示index out of bounds请问这个怎么解决? 解决方案 你调用数组的时候,下标越界了.调用数组的时候判断一下长度吧--擦汗 解决方案二: java的数组(2)java 数组2

ruby 怎么利用正则表达式在把一个字符串数组中的数字放到一个数组中?

问题描述 ruby 怎么利用正则表达式在把一个字符串数组中的数字放到一个数组中?str='100good200bad300ok'问题补充:说错了是把一个字符串中的所有数字放到一个数组中:)问题补充:是 100 200 300不过还是谢谢sunfjun 解决方案 str='100good200bad300ok' str.scan(/d+/)解决方案二:String的这个scan方法真不错, shaquan6776解决方案三:'100good200bad300ok'.split(/[^d]/).re

怎么调用数组中的元素全是数组

问题描述 求大神们帮我看看 解决方案 解决方案二:不就是个数组么?解决方案三:直接用下标访问就是了,你的问题是什么解决方案四:本身就是元素为数组的数组,当然里面全是数组啦!解决方案五:[0,0]13.0意思是在二维数组0,0位置的元素值为13.0解决方案六:这个数组是从MATLAB中的元胞数组调出来的,数组中的元素全部是数组,请问怎么取出其中的数组元素解决方案七:这个就是一个二维数组喽doubles=double[0][0];s=13.0解决方案八:inta=arr[0][0]这样解决方案九:差

php-怎样删除二维数组中相同的一位数组 并保持相同键名 求大神写个函数

问题描述 怎样删除二维数组中相同的一位数组 并保持相同键名 求大神写个函数 Array ( [0] => Array ( [year] => 2013-2014 [term] => 1 [course_code] => 00008069 [course_name] => 咖啡世界 [course_nature] => 任意选修 [course_attribution] => 人文素养类 [credit] => 2.0 [point] => 4.1 [g

插入一个整数到一个有序的数组中,并保证该数组是有序的

需求:将一个数插入到一个有续的数组中,插入成功后,还要保证该数组中的数是有序的 思考: 1).用折半查找法找到这个数在数组中的位置,如果这个数存在数组中,就把这个数插入到这个数所在数组中的位置上就可以了,如果这个数不存在数组中,则返回这个数组中最小下标的值,该下标值就是该数要插入数组中的位置 2).将这个数插入到指定数组中的位置 /** * 折半查找法找到一个元素在数组中的下标 * @param arr 数组 * @param key 要查找的元素 * @return 找到则返回元素在数组中的下

JS从数组中随机取出几个数组元素的方法_javascript技巧

JS如何从一个数组中随机取出一个元素或者几个元素. 假如数组为 var items = ['1','2','4','5','6','7','8','9','10']; 1.从数组items中随机取出一个元素 var item = items[Math.floor(Math.random()*items.length)]; 2.从前面的一篇随机数组中随机取几个元素 function getRandomArrayElements(arr, count) { var shuffled = arr.sl

JS数组中相同元素生成新数组

我们经常要做把数组中相同元素删除,这个好实现如下 split用法  代码如下 复制代码 •<script language="javascript">   •function spli(){   •         datastr="2,2,3,5,6,6";      •  var str= new Array();   •  •  str=datastr.split(",");      •    for (i=0;i<st

百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序

一.题目理解       题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序.要求空间复杂度为O(1).注:al[i]元素是支持'<'运算符的.       数据结构第一章就讲了有序表合并,不过那时候是合并到新表,判断条件是while(i<len1||j<len2),然后把a1或者a2数组(只有一个,因为另一个必定已经完全插入进了c数组,这也是为什么while条件是&quo