`
deepnighttwo
  • 浏览: 52154 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

大学时候想的一个算法——计算数组中最大和序列

 
阅读更多
本文与java语言无关,纯粹就是个解决问题的想法

问题:给定一个数组,要求求出数组中连续数和最大的索引对。比如,给定一个数组,里面有正数有负数和0。其中肯定有一个连续的序列(连续的,中间不能间断),比如说是索引3到索引5,这个序列的和是这个数组中连续序列中最大的,别的都没这个大。
{0,2.-1,9,7.6,-8,16},这个数组中就是索引三到索引五这个连续序列的和最大。要求算法的时间复杂度问O(n)。

问题解决:如果时间复杂度要求是O(n³)或者是O(n平方),就没意思了,直接循环搞定。

O(n)的时间复杂度如何解决:

注意,因为整个数组可能都是负数,这时候问题就退化成寻找数列中最大的负数了。首先,针对这种情况进行处理,将数组进行一次循环,找出第一个非负数索引和最后一个非负数索引,这个可以在一次循环中完成,如果 1)没找到,说明数组中全是负数,泽跳出循环,进行下一轮循环,寻找最大负数 2)如果两者相等,说明数组中只有一个正数,直接返回索引对 3)如果两者不等,则是相对复杂的情况,下面进行处理,到现在位置,时间复杂度是O(n),因为之循环了一次。

1:将数组的第一个非负索引和最后一个非负索引之间的连续的正数和连续的负数相加。比如{0,2.-1,9,7.6,-8,16},处理完后就应该得到数组{2, -1, 22, -8, 16}。这样整个数组就肯定是一个正负相间的数组。而且开头和结尾肯定是非负数。在进行处理的时候,还要维护一个大小是结果两倍的数组,用来存储每个元素的原来序列数值,比如,对于上面的数组,这个序列数组就应该是{0,1,2,2,3,5,6,6,7},这个数组是数组index,其中0,1是第一个元素在原来数组中的序列,2,2 是第二个元素在原来数组中的序列,3,5是第三个元素在原数组中的序列,依此类推。本步骤的时间复杂度也是O(n),没有循环嵌套,空间复杂度是O(2n)

2:现在得到一个正负相间的数组,而且数组中开头结尾都是非负数,而且数组中没个元素在原始数组中的索引序列对都是知道的。然后:
int start = 0;
int end = 0;
int count = 0;
对这个数组进行一次循环,循环中:
count += 数组[i]
if(count > 0){
将count的索引对(start, end)放入数组A中
将count的数值放入数组B中
} else{
count = 0;
}
这个循环时间复杂度是O(n),空间复杂度O(2n)
循环结束后,要的结果就在数组A和数组B中,遍历数组B找到最大的元素,然后根据最大元素的索引去A中找出索引对,然后根据这个索引对去前面的数组index找出结果。时间复杂度O(n)


整个算法看下来,时间复杂度就是O(n),进行了4次O(n)的循环,空间复杂度比较大一些,最大可能需要原来数组大小五倍的存储空间才能完成整个计算。





分享到:
评论

相关推荐

    算法实习:分治算法求n个数的数组中找出第二个最大元素

    本文将探讨如何使用分治策略来解决一个特定的问题——在一个包含n个整数的数组中找到第二大的元素。 #### 分治算法原理 分治(Divide and Conquer)是一种重要的算法设计策略,它通过递归地将一个问题分解成两个或...

    数据与算法——实验报告——数列递增子序列

    在数据与算法的领域中,解决数列的最长递增子序列问题一直是一个核心议题。它不仅在理论上具有重要的地位,更在实际应用中发挥着关键作用。在EE课程中,我们通过实验报告的形式,深入探讨了如何通过动态规划方法来...

    C语言实验报告——数组

    6. **异常情况处理**:在处理矩阵对调和折半查找时,需要考虑特殊情况,如最大值和最小值在同一行上,或者在无序数组中进行查找。这需要添加适当的条件判断,以确保程序的健壮性。 通过以上实验,你可以深入理解...

    算法分析实验_最大子段和问题代码

    在这个“算法分析实验_最大子段和问题代码”中,我们关注的是一个经典的算法问题——寻找数组中的最大子段和。这是一个重要的计算机科学问题,它涉及到动态规划和数组处理的基本概念。在这里,开发者使用C#编程语言...

    程序员实用算法——sourceCode

    "程序员实用算法——sourceCode"这个主题涵盖了各种在实际开发中经常遇到的算法,通过源代码的形式来展示这些算法的实现。下面将详细介绍一些重要的算法类型及其应用。 1. 排序算法:包括快速排序、归并排序、冒泡...

    求一个含有8个整数的数组中前3个最大值对应的下标

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在这个问题中,我们不需要完全排序,只需要找出...

    查找 算法——数据结构

    1. 首先,我们需要一个已排序的数组或序列,这里使用了顺序表作为存储结构,并且表中第0个元素作为哨兵,用于边界条件处理。 2. 初始化查找范围,设置两个指针`low`和`high`,分别表示查找区间的开始和结束位置。 3....

    后缀数组——罗穗骞附件(源码)

    后缀数组是字符串处理中的一个重要数据结构,尤其在算法竞赛(如OI)和文本处理领域广泛应用。罗穗骞,可能是某位知名的OI教练或专家,提供了关于后缀数组的源码和相关题目,帮助学习者深入理解这一概念。 后缀数组...

    武汉理工大学数据结构与算法实验——欢乐连连看(非线性结构)

    《武汉理工大学数据结构与算法实验——欢乐连连看(非线性结构)》是针对计算机科学教育的一项重要实践项目,旨在深化学生对数据结构与算法的理解和应用。在本实验中,核心关注的是非线性结构的运用,这通常涉及到树...

    分子模拟中的最大子数组计算.pptx

    - **Kadane 算法**: 该算法采用动态规划的思想,通过维护两个变量——当前子数组和与全局最大子数组和,来逐步更新并找到最大子数组。时间复杂度为 O(n)。 - **优化**: 可以使用累积和数组来进一步提高效率。累积...

    数组和链表——精选推荐 数组和链表.pdf

    数组和链表是两种常见的线性数据结构,它们都是由具有相同类型的n(n≥0)个数据元素组成的有限序列。下面我们将详细介绍数组和链表的基本组成部分、特点和Java实现。 一、数组 数组是最常用的线性数据结构,数组中...

    算法合集之《后缀数组——处理字符串的有力工具》

    后缀数组SA则是一个整数数组,长度同样为n,其中SA[i]表示第i个最小的后缀在原字符串中的起始位置。例如,对于字符串“banana”,其后缀数组为[6, 5, 3, 1, 2, 4],分别对应后缀“a”, “na”, “ana”, “banana”,...

    最长重复子数组 && 最长公共子序列(csdn)————程序.pdf

    最长公共子序列问题的目标是在两个序列S和T中找到一个最长的子序列,这个子序列同时出现在S和T中,且各个元素在原序列中的相对次序保持不变。这与最长重复子数组不同,最长公共子序列可以是不连续的。 解决最长公共...

    跟我学Java面向对象程序设计技术及应用——应用冒泡排序算法实现数组元素排序的Java程序实现示例.pdf

    3. 在JavaBubbleSort类中定义待排序的数组和一个用于临时存储数据的变量。 4. 编写冒泡排序的程序代码,使用嵌套for循环来实现冒泡排序的过程。外层循环控制遍历的轮数,内层循环负责比较和交换相邻元素。 通过这样...

    C++算法-最大子序列和.zip

    最大子序列和问题是一个寻找一串数组中具有最大和的连续子数组的问题。这个问题最早由计算机科学家Dijkstra提出,并在1977年由Kadane提出了一种简单的线性时间复杂度的解决方案,被称为Kadane's Algorithm。 Kadane...

    算法可视化系列——排序算法——选择排序

    **选择排序**是一种简单直观的排序算法,它的工作原理如下:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾...

    算法实验——包括了排序、最长公共子序列等一系列算法

    这是一个有关算法的压缩包,里面包含二分算法、合并排序、最长公共子序列、最优装载、活动安排算法

    数据结构与算法——C++版(第3版)源文件

    在《数据结构与算法——C++版(第3版)》中,作者深入浅出地介绍了这些核心概念,并提供了源代码以供学习和实践。 本书可能涵盖了以下几个重要的知识领域: 1. **基础数据结构**:首先,书中会介绍基本的数据结构,...

    数据结构课程设计——数组链表——单词统计

    数据结构课程设计中,主题是实现一个基于数组链表的数据结构来统计文本中特定单词的出现次数和位置。这个程序被称为“文学研究助手”,旨在帮助研究人员统计英文小说中指定单词的频率及其在文中的位置。以下是对这个...

Global site tag (gtag.js) - Google Analytics