常见数据结构面试题目(三)

题目:

        输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
 
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

       思路:根据题目,连续元素组成的子数组的和是一条存在波峰和波谷的的曲线。当被加的元素为负数时,前面连续元素的和必然是波峰;当被加元素是正数时,前面连续元素的和必然是波谷。其中的最大值与最小值必然出现在波峰点和波谷点。假设前面连续个元素的和为total,截止到目前的最大子数组和为max,当Value n+1个元素为负数时,则total为波峰值,取total与max中的最大值作为最大子数组和max。若total与Value n+1的和小于零,则Value n+2应作为波峰记录。经过一轮后,max即为所求最大值。算法只需一次遍历便可求出最大值,满足时间复杂度要求。
算法实现如下:
public class ArrayMax {

	public static Integer max(List<Integer> list){
		
		int max = 0 ;
		int total = 0 ;
		for(int i = 0 ; i<list.size() ; i ++){
			
				int num = list.get(i);
				if(list.get(i) >= 0){
					total += list.get(i);
				}else{
					max = total;
					total += list.get(i);
					if(total <0){
						  total = 0;
					}
				}
		}
		return max;		
	}
	
	public static void main(String[] args) {

		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(-2);
		list.add(3);
		list.add(10);
		list.add(-4);
		list.add(7);
		list.add(2);
		list.add(-5);
		int max = max(list);
		System.out.print(max);		
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值