输入一个有正负整数的数组,寻找最大子数组
2017-10-21 17:36
302 查看
给定一个整型数组,里面的元素有正有负,数组中连续的一个或者多个整数构成一个子数组。求所有子数组中元素和的值最大的子数组。
分析思路: 需要2个变量来标记已经记录下的当前最大子数组的起始位置start0和末尾位置end0
需要2个变量来标记正在寻找的子数组的起始位置start1和末尾位置end1
需要两个子数组和值记录sum0,sum1
1、先将整个数组作为最大子数组,并求sum0
2、从数组的起始位置开始标记start1=end1=0;sum1=array[start1]
3、sum1比0大,说明start1有可能作为最大子数组的起始位置,同理end1有可能作为最大子数组的末尾位置
sum1比0小,说明start1不可能作为最大子数组的起始位置,start1++;end1=start1; sum1=array[start];
sum1比sum0大,更新最大子数组的起始和末尾位置 start0=start1;end0=end1;sum0=sum1;
4、循环遍历整个数组
分析思路: 需要2个变量来标记已经记录下的当前最大子数组的起始位置start0和末尾位置end0
需要2个变量来标记正在寻找的子数组的起始位置start1和末尾位置end1
需要两个子数组和值记录sum0,sum1
1、先将整个数组作为最大子数组,并求sum0
2、从数组的起始位置开始标记start1=end1=0;sum1=array[start1]
3、sum1比0大,说明start1有可能作为最大子数组的起始位置,同理end1有可能作为最大子数组的末尾位置
sum1比0小,说明start1不可能作为最大子数组的起始位置,start1++;end1=start1; sum1=array[start];
sum1比sum0大,更新最大子数组的起始和末尾位置 start0=start1;end0=end1;sum0=sum1;
4、循环遍历整个数组
#include #include using namespace std; /* 一个数组,从数组的起始位置开始,如果大于0,说明可以继续往后逐个添加作为子数组的拓展,如果寻找过程中最大子数组的总和小于0 ,说明碰到一个迫使总和降到0以下的数,这个时候应该往后重新标定寻找最大子数组的开始下标和末尾下标,继续往后找。 */ int main() { int a[] = {3,2,-6,4,7,-3,5,-2};//数组 int N = sizeof(a) / sizeof(int);//数组长度 int start0 = 0;//最大子数组起始下标 int end0 = N - 1;//最大子数组 int sum0=0;//最大子数组总和 int start1 = 0;//寻找最大子数组起始下标 int end1 = start1;//寻找最大子数组末尾下标 int sum1=start1;//寻找最大子数组总和 //先将整个数组作为最大子数组,求和 for (int i = 0; i < N; i++) { sum0 += a[i]; } //一次遍历 for(int i=0;i sum0) { start0 = start1; end0 = end1; sum0 = sum1; continue; } else if(sum1<0) //sum1小于0,说明前面那个子数组到这个当前的数往后是不能再加了,start1要往后移end1也要往后面移 { start1++; end1 = start1; sum1 =a[start1]; continue; } else if(sum1>0)//sum1>0,end1要往后移 { end1++; sum1 +=a[end1]; } } //最后start0是记录最大子数组的起始下标,end0记录的是最大子数组的末尾下标,sum0是记录最大子数组的总和 for (int i = start0; i <= end0; i++) cout << a[i] << " "; cout << endl; cout << "子数组下标起始:" << start0 << ";子数组下标结尾:" << end0 << endl; cout <<"最大子数组总和:"<< sum0 << endl; return 0; }
相关文章推荐
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 输入一个整形数组,数组中有正数也有负数,求该数组中所以子数组和的最大值
- js实现输入一个数组,实现数组元素能够组成的最大整数
- 设一个长度为10的整型数组, 0)要求每个元素的值通过scanf输入,输入完成后, 1)请顺序输出这些整数, 2)请倒序输出这些整数, 3)输出这些数中的最大值, 4)输出这些数中的最小值
- 【1】 设一个长度为10的整型数组,  0)要求每个元素的值通过scanf输入,输入完成后,  1)请顺序输出这些整数,  2)请倒序输出这些整数,  3)输出这些数中的最大值,最小值
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- 寻找一个整数数组中最大值。(测试程序)
- js实现输入一个数组,实现数组元素能够组成的最大整数
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
- 在一个整数数组中寻找符合A+B=C的组合,使C为最大
- 一个整数数组(正负,0),找出这个数组的最大子序列
- java快速寻找一个数组的最大值或最小值, min, max,三种方法
- 输入一个升序数组和一个整数,在数组里面找两个数使它们相加的和为这个整数
- 算法3:找出一个整数数组里面两个查值最大的两个下标a[j]-a[i]最大并且i<j
- 结对开发之返回一个二维整数数组中最大联通子数组的和