一个数组,有正有负,不改变顺序的情况下,求和最大的最长子序列
2017-10-17 11:18
495 查看
第一常规方法,时间复杂度O(n*n)
先从第一个元素开始向后累加,
每次累加后与之前的和比较,保留最大值,
再从第二个元素开始向后累加,以此类推。
public static int maxSubSumQuadratic(int[] array) {
int maxSum = 0; //最大子序列求和
int maxStart = 0;
int maxEnd = 0;
//start表示要求和的子序列的开始索引,end表示结束索引
for(int start = 0; start < array.length; start++) {
int thisSum = 0; //当前子序列求和
for(int end = start; end < array.length; end++) {
//已求得的array[start]~array[end-1]子序列的和加上array[end]
//得到array[start]~array[end]子序列的和
thisSum += array[end];
//判断是否大于之前得到的最大子序列求和
if(thisSum > maxSum) {
maxSum = thisSum;
maxStart = start;
maxEnd = end;
}
}
}
System.out.println(maxStart);
System.out.println(maxEnd);
System.out.println(maxSum);
return maxSum;
}
第二:线性时间算法,最优方法,时间复杂度O(n)
和最大的子序列的第一个元素肯定是正数
因为元素有正有负,因此子序列的最大和一定大于0
该算法在每次元素累加和小于0时,从下一个元素重新开始累加
public static int maxSubSumLinear(int[] array) {
int maxSum = 0, thisSum = 0;
int maxStart = 0;
int maxEnd = 0;
for(int j = 0; j < array.length; j++) {
thisSum += array[j];
//如果累加和出现小于0的情况,
//则和最大的子序列肯定不可能包含前面的元素,
//这时将累加和置0,从下个元素重新开始累加
if (thisSum < 0) {
thisSum = 0;
maxStart = j+1;
}else if(thisSum > maxSum) {
maxSum = thisSum;
maxEnd = j;
}
}
System.out.println(maxStart);
System.out.println(maxEnd);
System.out.println(maxSum);
return maxSum;
}
先从第一个元素开始向后累加,
每次累加后与之前的和比较,保留最大值,
再从第二个元素开始向后累加,以此类推。
public static int maxSubSumQuadratic(int[] array) {
int maxSum = 0; //最大子序列求和
int maxStart = 0;
int maxEnd = 0;
//start表示要求和的子序列的开始索引,end表示结束索引
for(int start = 0; start < array.length; start++) {
int thisSum = 0; //当前子序列求和
for(int end = start; end < array.length; end++) {
//已求得的array[start]~array[end-1]子序列的和加上array[end]
//得到array[start]~array[end]子序列的和
thisSum += array[end];
//判断是否大于之前得到的最大子序列求和
if(thisSum > maxSum) {
maxSum = thisSum;
maxStart = start;
maxEnd = end;
}
}
}
System.out.println(maxStart);
System.out.println(maxEnd);
System.out.println(maxSum);
return maxSum;
}
第二:线性时间算法,最优方法,时间复杂度O(n)
和最大的子序列的第一个元素肯定是正数
因为元素有正有负,因此子序列的最大和一定大于0
该算法在每次元素累加和小于0时,从下一个元素重新开始累加
public static int maxSubSumLinear(int[] array) {
int maxSum = 0, thisSum = 0;
int maxStart = 0;
int maxEnd = 0;
for(int j = 0; j < array.length; j++) {
thisSum += array[j];
//如果累加和出现小于0的情况,
//则和最大的子序列肯定不可能包含前面的元素,
//这时将累加和置0,从下个元素重新开始累加
if (thisSum < 0) {
thisSum = 0;
maxStart = j+1;
}else if(thisSum > maxSum) {
maxSum = thisSum;
maxEnd = j;
}
}
System.out.println(maxStart);
System.out.println(maxEnd);
System.out.println(maxSum);
return maxSum;
}
相关文章推荐
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱). 第二解
- 给一个数组,求a[i]<a[j]的情况下,j-i的最大值是多少,要求用O(n)时间复杂度
- 设一个长度为10的整型数组, 0)要求每个元素的值通过scanf输入,输入完成后, 1)请顺序输出这些整数, 2)请倒序输出这些整数, 3)输出这些数中的最大值, 4)输出这些数中的最小值
- 求一个整数数组最长递减子序列
- “一个数组有正负0,求和为0的最长连续子数组”的失败解法
- 一个int数组,求乘起来最大的连续子序列
- 给定一个整数数组,求它的一个最长递增子序列。
- 【1】 设一个长度为10的整型数组,  0)要求每个元素的值通过scanf输入,输入完成后,  1)请顺序输出这些整数,  2)请倒序输出这些整数,  3)输出这些数中的最大值,最小值
- 求数组中的最大子数组之和,最长递增子序列
- 写一个方法,将一个长度超过10的数组最后5项直接截取,不改变顺序变为前五项
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的相对顺序.
- 有一个整型二维数组,假设a[3][4] = {初始化了值},求出这个二维数组中所有的最大值,以及最大值对应的下标。 数组内部原有的值不能改变位置。
- 有一个数组,由正整数、负整数、零组成,求和最大的连续子数组
- “数组最大值求和”结对情况
- 一个无序的数组,在不改变数组内部值的情况下,输出排好序的数组
- 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).
- 百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。 要求时