带负数的数列,求解和最大的相邻子序列之一:性能最佳

该程序实现了一个寻找给定负数数组中和最大的相邻子序列的功能。通过遍历数组,更新最大子序列的起点、终点和和,最终返回最大和及相关信息。示例中分别处理了不同输入数组的情况。
摘要由CSDN通过智能技术生成
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,-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("max of arr-->");
		maxSub(arr);
		System.out.print("max of arr1-->");
		maxSub(arr1);
		System.out.print("max of ar2-->");
		maxSub(arr2);
		Map<String, Object> retMap = new HashMap<String, Object>();
		System.out.println(retMap.get("star"));
	}
	
	public static Map<String, Object> maxSub(double[] arr)
	{
		/**
		 * start,end位目前sum值的起点和终点,
		 * maxStart,maxEnd为目前遍历过的区间中和最大的连续子序列的起点和终点,
		 * 最大和为maxSum
		 */
		Map<String, Object> retMap = new HashMap<String, Object>();
		
		if(arr==null||arr.length==0)
		{
			System.out.println("数组为空");
			return retMap;
		}
		
		int index=1,start=0,end=0,maxStart=0,maxEnd=0;
		double sum=arr[0],maxSum=arr[0];
		
		for(;index<arr.length;index++)
		{
			/**
			 * 先考虑当前值小于0的情况:
			 * 1 0>arr[index]>maxSum
			 * 2 arr[index]<=maxSum
			   /*arr[index]<=maxSum的确情况又分成下面两种:   
				* 2.1 sum<0
				* 2.2 sum>=0
			 */
			if(arr[index]<0)
			{
				if(arr[index]>maxSum)
				{
					maxSum = arr[index];
					sum = arr[index];
					start=end=maxStart=maxEnd=index;
				}
				else {
					if (sum<0) {
						sum=arr[index];
						start=end=index;
					}
					else {
						sum+=arr[index];
						end = index;
					}
				}
				
			}
			
			/**
			 * arr[index]>=0,分成下面两种情况:
			 * 1 sum>=0
			 * 2 sum<0
			 */
			else {
				if(sum>=0)
				{
					end = index;
					sum+=arr[index];
				}
				else {
					start=end=index;
					sum=arr[index];
				}
				
				if (sum>maxSum) {
					maxStart = start;
					maxEnd = end;
					maxSum = sum;
				}
			}
		}
		
		retMap.put("maxSum", maxSum);
		retMap.put("maxStart", maxStart);
		retMap.put("maxEnd", maxEnd);
		
		System.out.println("maxSum:"+maxSum+" maxStart:"+maxStart+" maxEnd:"+maxEnd);
		
		return retMap;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值