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

来源:互联网 发布:epsonl310清零软件下载 编辑:程序博客网 时间:2024/05/09 12:33

程序分两步来实现:

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;}}


0 0
原创粉丝点击