您的位置:首页 > 编程语言

带负数的数列,求解和最大的相邻子序列之二:代码清晰

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: