`
cynhafa
  • 浏览: 163216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编程之美连载——连续子数组和的最大值

 
阅读更多

问题


给定一整数数组,求连续的子数组和的最大值,例如:
1, -2, 3, 5, -3, 2 最大值为8
0, -2, 3, 5, -1, 2 最大值为9

分析


《编程之美》中给出的算法很精炼,然而解释却比较复杂,如果从“分级组合”的角度去理解要方便很多。

解法


设置两个整数变量:cur 和sum,从给定数组中依次取出所有元素,加到cur 上去,当cur<0 时候重置cur。sum 记录cur 出现过的最大值:

var cur = array[0];
var sum = cur;
for (int i = 1; i < array.Length; i++)
{
cur = cur < 0 ? array[ i ] : cur + array[ i ];
if (sum < cur) sum = cur;
}
return sum;

扩展问题二解法

如果要求得到最大和的连续子数组的起始位置,那么通过以上思路就更加容易写出代码:

int start1 = 0, start2 = 0, end = 0;
var cur = array[0];
var sum = cur;
for (int i = 1; i < array.Length; i++)
{
    if (cur < 0)
    {
        cur = array[ i ];
        start2 = i;
    }
    else cur += array[ i ];
    if (sum < cur)
    {
        sum = cur;
        end = i;
        start1 = start2;
    }
}
//返回 [start1, end]

本例中,我们用start1,start2 来记录起始位置,end 来记录终止位置。start2 相当于“工作变量”,start1 保存历史最大和连续子数组的起始位置。

扩展问题一解法

如果给定的是数组是首尾相连的循环数组,如何求解?首先设计一个函数,求解给定数组中,从from 开始的,最多到to 结束的最大和连续子数组的末尾位置,思路和前面解法类似。

int MaxSum_Position(int[] array, int from, int to)
{
    int step = Math.Sign(to - from);
    int end = from;
    var cur = array[from];
    var sum = cur;
    for (int i = from + step; i != to + step; i += step)
    {
        cur += array[ i ];
        if (sum < cur)
        {
            sum = cur;
            end = i;
        }
    }
    return end;
}

有了这个函数以后,可以将循环数组中的问题分成两种情况:一种是连续子数组跨越了0 位置的,一种是没有跨越的:

int sum1 = MaxSum(array);//不跨越0 位置的最大和
int i = MaxSum_Position(array, 0, array.Length - 1);
int j = MaxSum_Position(array, array.Length - 1, 0);
int sum2 = 0;
if (i > j) j = i + 1;
for (int k = 0; k < array.Length; k++)
{
sum2 += array[ k ];
if (k == i) k = j - 1; //跳过中间空缺部分
}
return Math.Max(sum1, sum2);
分享到:
评论

相关推荐

    c语言数组参数最大值最小值

    在处理数组时,经常会遇到需要找到数组中的最大值和最小值的问题。这通常用于统计分析、排序算法或其他数学计算中。这个程序的目标就是实现这个功能。 首先,我们需要了解C语言数组的基本概念。数组是由相同类型...

    判断数组的最大值

    ### 判断数组最大值 找出数组中的最大值,我们可以遍历数组并用一个变量记录当前找到的最大值。初始时,这个变量可以设置为数组的第一个元素,然后依次与后续元素比较。以下是实现这个功能的C#代码: ```csharp ...

    ACM例题,给定一个整数数组,找到一个具有最大和的连续子数组

    问题描述:给定一个整数数组,找到一个具有最大和的连续子数组。 解决方案:使用Kadane算法,该算法可以在O(n)时间复杂度内解决这个问题。 附件代码定义了一个maxSubArraySum函数,它接受一个整数数组nums作为参数...

    Python语言描述连续子数组的最大和

    问题的核心在于给定一个包含正数和负数的一维数组(向量),我们需要找到该数组的一个连续子数组(至少包含一个元素),使得该子数组的元素之和达到最大。例如,对于数组`{6, -3, -2, 7, -15, 1, 2, 2}`,连续子数组...

    找出一个整型数组中的元素的最大值

    根据给定的信息,我们可以分析并总结出以下与“找出一个整型数组中的元素的最大值”相关的知识点: ### 1. C++程序结构 在提供的代码片段中,虽然标记为C语言,但实际上使用的是C++语法。这段代码展示了如何在C++...

    图书销售管理系统——贯穿实例之数组应用实验说明

    ### 图书销售管理系统——贯穿实例之数组应用实验说明 #### 实验内容概述 本实验旨在通过设计一个小型的图书销售管理系统来实现对图书信息的基本管理功能。这些功能主要包括:添加图书、显示图书信息、查找图书、...

    c语言+从键盘输入10个无序的整数,存放在数组中,找出数组中最大值与最小值的所在的位置,并输出数组元素所在的位置与数组元素的值

    这里的输出格式是正确的,但要注意,如果数组中有多个相同的最大或最小值,程序只会输出第一个找到的最大值和最小值的索引。 为了使程序完全符合题目要求,可以进行以下优化: 1. 将数组大小更改为`int a[10]`。 2...

    以问题为导向的教学方法研究——以C语言数组为例.pdf

    在实际编程场景中,如计算大量学生的成绩平均值,传统方法可能需要反复输入数据。问题在于,如何适应不同数量的学生,避免繁琐的重复输入? 2. **学生讨论与问题深入**: 学生可能会尝试增加循环次数来处理更多...

    C++求二维数组中的最大值和最小值的方法

    本文将详细介绍如何在C++中找到二维数组中的最大值和最小值。首先,我们需要理解二维数组的基本概念。二维数组可以看作是一组一维数组的集合,其中每个一维数组都称为行。因此,我们可以用两个索引(一个代表行,另...

    python求最大连续子数组的和

    这个问题的目标是找到一个数组中的连续子数组,使得这个子数组的元素之和最大。 首先,我们可以使用**暴力枚举**的方法来解决这个问题。这种算法的思想是从数组的第一个元素开始,遍历所有可能的子数组,计算每个子...

    二维数组求最大数

    - **函数功能**: 找出二维数组中的最大值,并通过`line`和`row`指针返回最大值的位置。 ##### 2. 查找最大值算法 ```c int max = array[0][0]; int i = 0, j = 0; for (; i ; i++) { for (j = 0; j ; j++) { if ...

    如何求最大值以及所在数组里的位置

    在计算机编程中,寻找数组中的最大值及其位置是一项基础且重要的技能。本文将详细介绍一个原创的C语言算法实现,该算法能够有效地找到数组中的最大值及其索引,并通过理解这个过程来帮助读者掌握算法思想,从而能够...

    PHP实现求连续子数组最大和问题2种解决方法

    关于连续子数组最大和这个问题,有两种解法,一种是动态规划 解法如下: function getMaxSubSum($arr){ $curSum = $arr[0]; $maxSum = $arr[0]; for($i = 1; $i &lt; count($arr); $i++){ if

    js代码-力扣53-给定一个数组,找到具有最大和的连续子数组

    **力扣53题——最大连续子数组和** 在编程竞赛和面试中,"最大连续子数组和"问题是一个常见的动态规划题目。力扣(LeetCode)53题要求我们给定一个整数数组,找到其中具有最大和的连续子数组,并返回这个和。这个...

    求数组中最大值2

    本话题将深入探讨如何在Java中使用JUnit进行单元测试来验证求解数组最大值的算法。 首先,我们需要理解JUnit的基本概念。JUnit是Java编程语言的一个开源测试框架,主要用于编写和运行可重复的单元测试。它提供了...

    PTA-交换最小值和最大值

    在此挑战中,我们需要编写一个程序,该程序接收一个整数数组,找到其中的最大值和最小值,并交换它们的位置,然后返回结果数组。 描述中的 "PTA" 很可能代表 "Programming Task Assistant" 或类似的在线平台,它...

    java代码-数组的最大值,最小值,平均值

    总结一下,这个Java代码示例展示了如何利用基本的循环和条件判断来处理数组数据,找出其中的极端值和计算平均值。这对于任何初级或中级Java开发者来说都是必备技能,因为它在许多实际问题中都有应用,比如统计分析、...

    取指定字节数组中的子数组 一个很好类例子

    标题 "取指定字节数组中的子数组 一个很好类例子" 暗示了这篇博客文章可能涉及的是关于如何从字节数组中提取出特定部分,即创建子数组的操作。在Java编程中,这样的操作通常是通过使用数组拷贝或者特定的类如`java....

    java代码-定义一个一维数组,求出数组的最大值,最小值,平均值

    本示例主要讲解如何定义一个一维数组,并通过编程计算出数组中的最大值、最小值以及平均值。这是一些基本的算法实现,对于任何程序员来说,理解并掌握这些概念都是至关重要的。 首先,让我们了解一下一维数组的基本...

    【经典题目】绝对差不超过限制的最长连续子数组——滑动窗+单调栈

    在编程和算法领域,"绝对差不超过限制的最长连续子数组"是一类常见的问题,它主要涉及数组处理、滑动窗口以及单调栈等技术。这类问题通常要求找到一个数组中的最长子数组,使得子数组中任意两个元素之间的绝对差不...

Global site tag (gtag.js) - Google Analytics