带负数的数列,求解和最大的相邻子序列之二:代码清晰
2016-09-25 11:20
465 查看
程序分两步来实现:
1. getMaxOfAllMinus(arr)----》遍历一遍数组,记录数组的最大值:
1.1 如果全为负数,则返回最大值max,下标pos,allMinus=true
1.2 如果碰到正数,则直接退出循环,返回allMinus=false
2. 如果第一步allMinus=false,则走接下来的逻辑
getMaxSumOver0 ----》遍历数组,赋初始值maxSum=sum=0,起止点start=maxStart=end=maxEnd=0
2.1 如果在下标为index时,sum<0,则sum=0,start=end=index+1
2.2 如果在下标为index时,sum>maxSum,则maxSum=sum,maxStart=start,maxEnd=end=index
package base.algorithm;
import java.util.HashMap;
import java.util.Map;
public class MaxSub {
public static void main(String[] args) {
double []arr={-1,-0.5,1,-100,1000,-800,900,-1000,-201,100,-80,990,-200,29};
double []arr1={-10,-2.4,-3,-6,-1,-22};
double []arr2={-10,-2.4,-3,0,-6,-1,-22};
System.out.print("maxSubSimplifyCoding==>max of arr-->");
maxSubSimplifyCoding(arr);
System.out.print("maxSubSimplifyCoding==>max of arr1-->");
maxSubSimplifyCoding(arr1);
System.out.print("maxSubSimplifyCoding==>max of ar2-->");
maxSubSimplifyCoding(arr2);
}
public static Map<String, Object> maxSubSimplifyCoding(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
if(arr==null||arr.length==0)
{
System.out.println("数组为空");
return retMap;
}
retMap = getMaxOfAllMinus(arr);
/**
* 先考虑全是arr[index]<=0恒成立的情况。
*/
if ((boolean) retMap.get("allMinus")) {
return retMap;
}
else {
return getMaxSumOver0(arr);
}
}
private static Map<String, Object> getMaxSumOver0(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
int index=1,start=0,end=0,maxStart=0,maxEnd=0;
double sum=0,maxSum=0;
/**
* 1. sum{index}>maxSum
* 2. 0<sum{index}<=maxSum
* 3. 0>=sum{index}
*/
for(;index<arr.length;index++)
{
sum+=arr[index];
if (sum<0) {
sum = 0;
//程序执行到这,已经排除了数列全为负数的情况
//容易证明arr[index]不可能是数组的最后一个元素
start=end=index+1;
}
if(sum>maxSum) {
maxStart = start;
maxEnd = end = index;
maxSum = sum;
}
}
System.out.println("maxSum:"+maxSum+" maxStart:"+maxStart+" maxEnd:"+maxEnd);
return retMap;
}
private static Map<String, Object> getMaxOfAllMinus(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
double max = arr[0];
int pos = 0;
boolean allMinus = true;
for(int index=0;index<arr.length;index++)
{
if (arr[index]>0) {
allMinus=false;
retMap.put("allMinus", allMinus);
return retMap;
}
if (arr[index]>max) {
max = arr[index];
pos = index;
}
}
retMap.put("allMinus", allMinus);
retMap.put("maxStart", max);
retMap.put("maxStart", pos);
retMap.put("maxEnd",pos);
System.out.println("maxSum:"+max+" maxStart:"+pos+" maxEnd:"+pos);
return retMap;
}
}
1. getMaxOfAllMinus(arr)----》遍历一遍数组,记录数组的最大值:
1.1 如果全为负数,则返回最大值max,下标pos,allMinus=true
1.2 如果碰到正数,则直接退出循环,返回allMinus=false
2. 如果第一步allMinus=false,则走接下来的逻辑
getMaxSumOver0 ----》遍历数组,赋初始值maxSum=sum=0,起止点start=maxStart=end=maxEnd=0
2.1 如果在下标为index时,sum<0,则sum=0,start=end=index+1
2.2 如果在下标为index时,sum>maxSum,则maxSum=sum,maxStart=start,maxEnd=end=index
package base.algorithm;
import java.util.HashMap;
import java.util.Map;
public class MaxSub {
public static void main(String[] args) {
double []arr={-1,-0.5,1,-100,1000,-800,900,-1000,-201,100,-80,990,-200,29};
double []arr1={-10,-2.4,-3,-6,-1,-22};
double []arr2={-10,-2.4,-3,0,-6,-1,-22};
System.out.print("maxSubSimplifyCoding==>max of arr-->");
maxSubSimplifyCoding(arr);
System.out.print("maxSubSimplifyCoding==>max of arr1-->");
maxSubSimplifyCoding(arr1);
System.out.print("maxSubSimplifyCoding==>max of ar2-->");
maxSubSimplifyCoding(arr2);
}
public static Map<String, Object> maxSubSimplifyCoding(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
if(arr==null||arr.length==0)
{
System.out.println("数组为空");
return retMap;
}
retMap = getMaxOfAllMinus(arr);
/**
* 先考虑全是arr[index]<=0恒成立的情况。
*/
if ((boolean) retMap.get("allMinus")) {
return retMap;
}
else {
return getMaxSumOver0(arr);
}
}
private static Map<String, Object> getMaxSumOver0(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
int index=1,start=0,end=0,maxStart=0,maxEnd=0;
double sum=0,maxSum=0;
/**
* 1. sum{index}>maxSum
* 2. 0<sum{index}<=maxSum
* 3. 0>=sum{index}
*/
for(;index<arr.length;index++)
{
sum+=arr[index];
if (sum<0) {
sum = 0;
//程序执行到这,已经排除了数列全为负数的情况
//容易证明arr[index]不可能是数组的最后一个元素
start=end=index+1;
}
if(sum>maxSum) {
maxStart = start;
maxEnd = end = index;
maxSum = sum;
}
}
System.out.println("maxSum:"+maxSum+" maxStart:"+maxStart+" maxEnd:"+maxEnd);
return retMap;
}
private static Map<String, Object> getMaxOfAllMinus(double[] arr)
{
Map<String, Object> retMap = new HashMap<String, Object>();
double max = arr[0];
int pos = 0;
boolean allMinus = true;
for(int index=0;index<arr.length;index++)
{
if (arr[index]>0) {
allMinus=false;
retMap.put("allMinus", allMinus);
return retMap;
}
if (arr[index]>max) {
max = arr[index];
pos = index;
}
}
retMap.put("allMinus", allMinus);
retMap.put("maxStart", max);
retMap.put("maxStart", pos);
retMap.put("maxEnd",pos);
System.out.println("maxSum:"+max+" maxStart:"+pos+" maxEnd:"+pos);
return retMap;
}
}
相关文章推荐
- 带负数的数列,求解和最大的相邻子序列之一:性能最佳
- 带负数的数列,求解和最大的相邻子序列之三:穷举法
- 最大子序列的求解分析(java代码实现)
- 求一个不含0的数列(可以有正数和负数)的最大子序列乘积java
- 数据结构之最大子序列的求解
- 求解最大子序列和
- 最大子序列求解 分治法和动态规划
- 没什么亮点的第一篇呐…C++代码,求斐波那契(Fibonacci)数列的第n项,n可以为负数。递归算法,使用了记忆化搜索。
- 不同方法求解两个数的最大公约数代码
- ACM_HDU 1231 最大连续子序列 (dp)_代码分析
- 设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。
- 最大子序列C++程序代码
- [C++]四种方式求解最大子序列求和问题
- 最大子序列和的求解(时间复杂度O(N))
- 和最大的子序列之二
- 动态规划求解最大连续子序列和
- 最大子序列问题及其求解
- 最大子字段和问题求解C++代码
- (C#)找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和